亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法

Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法

發布時間:2021-09-06 13:47:59 來源:億速云 閱讀:129 作者:chen 欄目:開發技術

這篇文章主要講解了“Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法”吧!

目錄
  • Shiro 處理ajax請求攔截登錄超時

    • 配置全局ajax配置

  • Shiro session超時頁面跳轉的處理

    • 問題描述

    • ajax請求超時處理

      • 后端Filter代碼

      • 前端通用ajax處理

    • 非ajax請求超時跳轉

    Shiro 處理ajax請求攔截登錄超時

    配置全局ajax配置

    $.ajaxSetup({
        complete:function(XMLHttpRequest,textStatus){
              if(textStatus=="parsererror"){
                   $.messager.alert('提示信息', "登陸超時!請重新登陸!", 'info',function(){
                       window.location.href = 'login.jsp';
                   });
              } else if(textStatus=="error"){
                  $.messager.alert('提示信息', "請求超時!請稍后再試!", 'info');
              }
        }
    });

    在js里面配置全局的ajax配置即可!

    Shiro session超時頁面跳轉的處理

    問題描述

    shiro在管理session后,在session超時會進行跳轉,這里有兩種情況需要考慮,一種是ajax方式的請求超時,一種頁面跳轉請求的超時。

    本文從這兩個方面分別考慮并處理。

    ajax請求超時處理

    思路:通過Filter后判定,當前是否session超時,超時判定是否是ajax請求,如果是ajax請求,則在response頭部設置session-status值,返回到前端讀取到相應值后進行處理

    后端Filter代碼
    package com.cnpc.framework.filter;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.session.Session;
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    /**
     * * filter過濾器,獲取項目路徑,設置ajax超時標識
     * @author billJiang QQ:475572229
     */
    public class SystemFilter implements Filter {
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,
                ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            System.out.println(request.getRequestURL());
            String basePath = request.getContextPath();
            request.setAttribute("basePath", basePath);
            if (!SecurityUtils.getSubject().isAuthenticated()) {
                //判斷session里是否有用戶信息
                if (request.getHeader("x-requested-with") != null
                        && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                    //如果是ajax請求響應頭會有,x-requested-with
                    response.setHeader("session-status", "timeout");//在響應頭設置session狀態
                    return;
                }
            }
            filterChain.doFilter(request, servletResponse);
        }
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
    }
    前端通用ajax處理

    注意session-status上下文部分

    function ajaxPost(url, params, callback) {
        var result = null;
        var headers={};
        headers['CSRFToken']=$("#csrftoken").val();
        $.ajax({
            type : 'post',
            async : false,
            url : url,
            data : params,
            dataType : 'json',
            headers:headers,
            success : function(data, status) {
                result = data;
                if(data&&data.code&&data.code=='101'){
                    modals.error("操作失敗,請刷新重試,具體錯誤:"+data.message);
                    return false;
                }
                if (callback) { 
                    callback.call(this, data, status);
                }
            },
            error : function(err, err1, err2) {
                console.log("ajaxPost發生異常,請仔細檢查請求url是否正確,如下面錯誤信息中出現success,則表示csrftoken更新,請忽略");
                console.log(err.responseText);
                if(err && err.readyState && err.readyState == '4'){
                    var sessionstatus=err.getResponseHeader("session-status");
                    if(sessionstatus=="timeout"){
                        //如果超時就處理 ,指定要跳轉的頁面
                        window.location.href=basePath+"/" ;
                    }
                    else{//csrf異常
                        var responseBody = err.responseText;
                        if (responseBody) {
                            responseBody = "{'retData':" + responseBody;
                            var resJson = eval('(' + responseBody + ')');
                            $("#csrftoken").val(resJson.csrf.CSRFToken);
                            this.success(resJson.retData, 200);
                        }
                        return;
                    }
                }           
                modals.error({
                    text : JSON.stringify(err) + '<br/>err1:' + JSON.stringify(err1) + '<br/>err2:' + JSON.stringify(err2),
                    large : true
                });
            }
        });
        return result;
    }

    非ajax請求超時跳轉

    在本試驗中,使用jquery.load方式進行了頁面加載,并重載jquery.fn.load改寫了該方法,通過beforeSend去除了ajax標識,由于超時返回的登錄頁面可能嵌入當前頁面,所以需要判斷當前獲得的頁面是否是登錄頁面,如果是登陸頁面,則再經過一次跳轉到登陸頁(或者首頁)。

    重載的jquery.fn.load方法如下,注意beforeSend和responseText.startWith部分內容。

    var _old_load = jQuery.fn.load;
    jQuery.fn.load = function( url, params, callback ) {
        //update for HANZO, 2016/12/22
        if (typeof url !== "string" && _old_load) {
            return _old_load.apply( this, arguments );
        }
        var selector, type, response,
            self = this,
            off = url.indexOf( " " );
        if ( off > -1 ) {
            selector = jQuery.trim( url.slice( off ) );
            url = url.slice( 0, off );
        }
        if ( jQuery.isFunction( params ) ) {
            callback = params;
            params = undefined;
        } else if ( params && typeof params === "object" ) {
            type = "POST";
        }
        if ( self.length > 0 ) {
            jQuery.ajax( {
                url: url,
                beforeSend: function( xhr ) {  
                        xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});  
                },  
                type: type || "GET", 
                dataType: "html",
                data: params
            } ).done( function( responseText ) {
                //console.log(responseText);
                response = arguments;
                //頁面超時跳轉到首頁
                if(responseText.startWith("<!--login_page_identity-->")){
                    window.location.href=basePath+"/";
                }else{
                    self.html(selector ?
                        jQuery("<div>").append(jQuery.parseHTML( responseText )).find(selector) :
                        responseText);
                }
            } ).always( callback && function( jqXHR, status ) {
                self.each( function() {
                    callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
                } );
            } );
        }
        return this;
    };

    可通過設置session的timeout來測試結果。需要注意的是ajax請求要使用ajaxPost方法,該方法統一處理了超時跳轉。

    感謝各位的閱讀,以上就是“Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法”的內容了,經過本文的學習后,相信大家對Shiro處理ajax請求攔截登錄超時以及session超時頁面跳轉的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    阿巴嘎旗| 鹿邑县| 台前县| 富阳市| 庆阳市| 横峰县| 陆丰市| 来凤县| 邛崃市| 那曲县| 兖州市| 拉萨市| 新昌县| 西吉县| 文安县| 延长县| 库伦旗| 盘锦市| 康乐县| 法库县| 通江县| 香河县| 墨竹工卡县| 肇东市| 洪湖市| 麻栗坡县| 灵丘县| 新乡市| 遵义市| 涞水县| 长治市| 南通市| 青浦区| 洛阳市| 汤阴县| 江山市| 绥棱县| 黔西| 尼勒克县| 贡觉县| 洪泽县|