一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問(wèn)題

解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問(wèn)題

2021-12-21 13:13Cx_軒 Java教程

這篇文章主要介紹了解決Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Shiro 處理ajax請(qǐng)求攔截登錄超時(shí)

配置全局ajax配置

?
1
2
3
4
5
6
7
8
9
10
11
$.ajaxSetup({
    complete:function(XMLHttpRequest,textStatus){
          if(textStatus=="parsererror"){
               $.messager.alert('提示信息', "登陸超時(shí)!請(qǐng)重新登陸!", 'info',function(){
                   window.location.href = 'login.jsp';
               });
          } else if(textStatus=="error"){
              $.messager.alert('提示信息', "請(qǐng)求超時(shí)!請(qǐng)稍后再試!", 'info');
          }
    }
});

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

Shiro session超時(shí)頁(yè)面跳轉(zhuǎn)的處理

問(wèn)題描述

shiro在管理session后,在session超時(shí)會(huì)進(jìn)行跳轉(zhuǎn),這里有兩種情況需要考慮,一種是ajax方式的請(qǐng)求超時(shí),一種頁(yè)面跳轉(zhuǎn)請(qǐng)求的超時(shí)。

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

ajax請(qǐng)求超時(shí)處理

思路:通過(guò)Filter后判定,當(dāng)前是否session超時(shí),超時(shí)判定是否是ajax請(qǐng)求,如果是ajax請(qǐng)求,則在response頭部設(shè)置session-status值,返回到前端讀取到相應(yīng)值后進(jìn)行處理

后端Filter代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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過(guò)濾器,獲取項(xiàng)目路徑,設(shè)置ajax超時(shí)標(biāo)識(shí)
 * @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請(qǐng)求響應(yīng)頭會(huì)有,x-requested-with
                response.setHeader("session-status", "timeout");//在響應(yīng)頭設(shè)置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上下文部分

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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("操作失敗,請(qǐng)刷新重試,具體錯(cuò)誤:"+data.message);
                return false;
            }
            if (callback) {
                callback.call(this, data, status);
            }
        },
        error : function(err, err1, err2) {
            console.log("ajaxPost發(fā)生異常,請(qǐng)仔細(xì)檢查請(qǐng)求url是否正確,如下面錯(cuò)誤信息中出現(xiàn)success,則表示csrftoken更新,請(qǐng)忽略");
            console.log(err.responseText);
            if(err && err.readyState && err.readyState == '4'){
                var sessionstatus=err.getResponseHeader("session-status");
                if(sessionstatus=="timeout"){
                    //如果超時(shí)就處理 ,指定要跳轉(zhuǎn)的頁(yè)面
                    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請(qǐng)求超時(shí)跳轉(zhuǎn)

在本試驗(yàn)中,使用jquery.load方式進(jìn)行了頁(yè)面加載,并重載jquery.fn.load改寫(xiě)了該方法,通過(guò)beforeSend去除了ajax標(biāo)識(shí),由于超時(shí)返回的登錄頁(yè)面可能嵌入當(dāng)前頁(yè)面,所以需要判斷當(dāng)前獲得的頁(yè)面是否是登錄頁(yè)面,如果是登陸頁(yè)面,則再經(jīng)過(guò)一次跳轉(zhuǎn)到登陸頁(yè)(或者首頁(yè))。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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;
            //頁(yè)面超時(shí)跳轉(zhuǎn)到首頁(yè)
            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;
};

可通過(guò)設(shè)置session的timeout來(lái)測(cè)試結(jié)果。需要注意的是ajax請(qǐng)求要使用ajaxPost方法,該方法統(tǒng)一處理了超時(shí)跳轉(zhuǎn)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_25223941/article/details/51732667

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 国产精品反差婊在线观看 | 韩国三级在线高速影院 | 羞羞一区二区三区四区片 | 国产chinese男男gaygay | 精品免费视在线视频观看 | 黄色a∨ | 四虎最新免费网址 | 视频国产91| 日本欧美大码a在线视频播放 | 天天爽天天操 | 久久中文字幕亚洲精品最新 | 免费一区视频 | 国产欧美日韩精品一区二 | 国产一级持黄大片99久久 | 女王厕便器vk | 成人一区二区免费中文字幕 | 日本高清在线观看天码888 | 亚洲春色综合另类网蜜桃 | 欧美巨胸| 污小说在线阅读 | 免费观看在线观看 | 欧美特黄视频在线观看 | 大象传媒短视频网站 | 成3d漫二区三区四区 | 人人爽人人射 | 日本-区二区三区免费精品 日本破处 | 免费高清视频免费观看 | 3d动漫美女被吸乳羞羞有 | 国内自拍成人网在线视频 | 欧美精品一区二区三区久久 | 亚洲mm色国产网站 | 色播影院性播影院私人影院 | 天堂成人在线观看 | 免费看全黄特黄毛片 | 欧美日韩一区二区三区在线观看 | 日韩欧美一区二区三区免费观看 | 国内自拍网红在线综合 | caoporm碰最新免费公开视频 | 99久久99久久久精品齐齐鬼色 | 亚洲免费闲人蜜桃 | 被老外玩爽的中国美女视频 |