Shiro处理ajax请求拦截登录超时以及session超时页面跳转的方法

发布时间:2021-09-06 13:47:59 作者:chen
来源:亿速云 阅读:129

这篇文章主要讲解了“Shiro处理ajax请求拦截登录超时以及session超时页面跳转的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shiro处理ajax请求拦截登录超时以及session超时页面跳转的方法”吧!

目录

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超时页面跳转的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 如何为jquery的ajax请求添加超时timeout时间
  2. vue axios请求超时的正确处理方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

shiro ajax session

上一篇:Java如何强制保留两位小数

下一篇:C++中位图和布隆过滤器的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》