Shiro处理ajax请求拦截登录超时以及session超时页面跳转的方法
这篇文章主要讲解了"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) + '
err1:' + JSON.stringify(err1) + '
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("")){ _window.location.href=basePath+"/"; }else{ self.html(selector ? jQuery("").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超时页面跳转的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
处理 页面 方法 登录 配置 信息 登陆 全局 内容 前端 问题 学习 代码 思路 情况 方式 标识 部分 错误 首页 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 胡又文网络安全 网络技术信道容量表达式 邯郸国家网络安全宣传周 华为公司软件开发 服务器混剪比赛 网络安全不是小事 导出数据库的数据 服务器的调优 大学生思政资源数据库中标 我的世界服务器国际怎么找 嘉定区互联网软件开发质量保证 新型数据库有哪些优势 配置服务器远程管理 数据库官网 机票预订系统数据库代码 人大金仓的数据库怎么查版本号 电脑软件的服务器地址快捷键 网络安全防护体系 数据库原理与数据库系统原理 弋江网络安全考试scsa认证 数据库技术与实践 海门不沉默软件开发工作室 2019年的网络安全教育日 恒泰证券2022服务器采购 2021网络安全心得体会 网络安全四个坚持题库 网络蚂蚁下载软件开发 无线网络技术第四版答案 广元服务器云存储经销商 昆山网络技术咨询服务