最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決Shiro 處理ajax請求攔截登錄超時的問題

 更新時間:2021年09月06日 11:28:34   作者:Cx_軒  
這篇文章主要介紹了解決Shiro 處理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狀態(tài)
                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發(fā)生異常,請仔細檢查請求url是否正確,如下面錯誤信息中出現(xiàn)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方法,該方法統(tǒng)一處理了超時跳轉。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java利用反射對list對象做過濾

    Java利用反射對list對象做過濾

    這篇文章主要介紹了Java利用反射對list對象做過濾,但是使用反射對效率有影響,但在一些特殊情況也有一定的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • Compare And Swap底層原理及代碼示例詳解

    Compare And Swap底層原理及代碼示例詳解

    這篇文章主要介紹了Compare And Swap底層原理及代碼示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 如何利用Ganymed SSH-2模擬SSH操作

    如何利用Ganymed SSH-2模擬SSH操作

    這幾天看SFTP資料時,無意中看到了Ganymed SSH-2,寫了個簡單demo,通過,感覺挺好用的,下面就和大家分享下。需要的朋友可以過來參考參考
    2013-08-08
  • Java模擬多線程實現(xiàn)搶票代碼實例

    Java模擬多線程實現(xiàn)搶票代碼實例

    這篇文章主要介紹了Java模擬多線程實現(xiàn)搶票,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • IDEA創(chuàng)建SpringBoot項目整合mybatis時mysql-connector-java報錯異常的詳細分析

    IDEA創(chuàng)建SpringBoot項目整合mybatis時mysql-connector-java報錯異常的詳細分析

    最近工作中發(fā)現(xiàn)了個錯誤,分享給同樣遇到這個問題的朋友,這篇文章主要給大家介紹了關于IDEA創(chuàng)建SpringBoot項目整合mybatis時mysql-connector-j報錯異常的詳細分析,需要的朋友可以參考下
    2023-02-02
  • 詳解Java中Callable和Future的區(qū)別

    詳解Java中Callable和Future的區(qū)別

    這篇文章主要介紹了Java中Callable和Future的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-11-11
  • Spring?Batch批處理框架操作指南

    Spring?Batch批處理框架操作指南

    Spring?Batch?是?Spring?提供的一個數據處理框架。企業(yè)域中的許多應用程序需要批量處理才能在關鍵任務環(huán)境中執(zhí)行業(yè)務操作,這篇文章主要介紹了Spring?Batch批處理框架操作指南,需要的朋友可以參考下
    2022-07-07
  • Java內存分配多種情況的用法解析

    Java內存分配多種情況的用法解析

    這篇文章主要介紹了Java內存分配多種情況的用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • idea編譯器工程out目錄修改方法步驟

    idea編譯器工程out目錄修改方法步驟

    多個工程在一個文件夾下,有時會變?yōu)樗械墓こ讨挥靡粋€out文件夾,這時運行會出錯,所以本文就來介紹一下out目錄修改,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 淺談java中==以及equals方法的用法

    淺談java中==以及equals方法的用法

    這篇文章主要介紹了淺談java中==以及equals方法的用法,涉及二者的用法示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

灵宝市| 金湖县| 丘北县| 德庆县| 寿阳县| 炉霍县| 南陵县| 海晏县| 乌兰察布市| 同心县| 左云县| 丰原市| 呼和浩特市| 佳木斯市| 依兰县| 乾安县| 牡丹江市| 通州市| 巨鹿县| 阳城县| 会同县| 青冈县| 合作市| 南阳市| 邮箱| 莱阳市| 安平县| 高陵县| 玉林市| 绥中县| 武冈市| 墨玉县| 额济纳旗| 大新县| 安平县| 杨浦区| 邵东县| 山丹县| 固安县| 南皮县| 温宿县|