shiro会话超时转跳,shiro默认session失效时间
目录
会话超时页面跳转的处理问题描述创建交互式、快速动态网页应用的网页开发技术请求超时处理非创建交互式、快速动态网页应用的网页开发技术请求超时跳转一个判断会议是否过期的小技巧1 .会话其实就是一个Map2.session的过期时间是从什么时候开始计算的?3.设置会议的失效时间4.如何判断会议过没过期
session超时页面跳转的处理
问题描述
shiro在管理会议后,在会议超时会进行跳转,这里有两种情况需要考虑,一种是创建交互式、快速动态网页应用的网页开发技术方式的请求超时,一种页面跳转请求的超时。
本文从这两个方面分别考虑并处理。
ajax请求超时处理
思路:通过过滤器后判定,当前是否会议超时,超时判定是否是创建交互式、快速动态网页应用的网页开发技术请求,如果是创建交互式、快速动态网页应用的网页开发技术请求,则在反应头部设置会话状态值,返回到前端读取到相应值后进行处理
后端Filter代码
包com。中石油。框架。过滤器;导入org。阿帕奇。四郎。安全工具;导入org。阿帕奇。四郎。会话。会话;导入javax。servlet。*;导入javax。servlet。http。http servlet请求;导入javax。servlet。http。http servlet响应;导入Java。io。io异常;/** * *过滤器过滤器,获取项目路径,设置创建交互式、快速动态网页应用的网页开发技术超时标识* @作者比尔江QQ :475572229 */public类系统过滤器实现Filter { public void do Filter(servlet request servlet request,ServletResponse servletResponse,FilterChain filterChain)抛出IOException,servlet exception { http servlet request request=(http servlet request)servlet请求;http servlet响应response=(http servlet响应)servlet响应;系统。出去。println(请求。getrequesturl());string basePath=request。getcontextpath();request.setAttribute(basePath ,basePath);如果(!SecurityUtils.getSubject().isAuthenticated()) { //判断会议里是否有用户信息如果(请求。get头( x-requested-with )!=空请求。获取标题(“x-requested-with”).equalsIgnoreCase( XMLHttpRequest ){//如果是创建交互式、快速动态网页应用的网页开发技术请求响应头会有,x-请求-有响应。set标头(“会话状态”、“超时”);//在响应头设置会议状态返回;} } filterChain.doFilter(请求,servlet响应);} @ Override公共void destroy(){//TODO自动生成的方法存根} @覆盖公共void init(过滤器配置参数0)抛出ServletException { //TODO自动生成的方法存根} }前端通用ajax处理
注意会话状态上下文部分
函数ajaxPost(url,参数,回调){ var结果=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("<!--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方法,该方法统一处理了超时跳转。
一个判断session是否过期的小技巧
Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下!
1.session其实就是一个Map
键=值对,通过session.getAttribute("name");获得session中设置的参数
2.session的过期时间是从什么时候开始计算的?
是从一登录就开始计算还是说从停止活动开始计算?
答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。
从该Session未被访问,开始计时; 一旦Session被访问,计时清0;
3.设置session的失效时间
a)web.xml中
<session-config> <session-timeout>30</session-timeout> </session-config>
b)在程序中手动设置
session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期
c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
4.如何判断session过没过期
request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。
这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以近似地认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。
方法如下:
if(request.getSession(false)==null) System.out.println("Session has been invalidated!");else System.out.println("Session is active!");
可能大家注意到我上面有一个近似地字眼,也就是说存在特别情况。
这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null,原因我想大家应该是显然的。
private boolean checkSession( HttpServletRequest request,HttpServletResponse response) {HttpSession session = request.getSession(false);String requestURI = request.getRequestURI();String contextPath = request.getContextPath(); requestURI = requestURI.substring(contextPath.length()); if(requestURI.equals("/") requestURI.equals("/login.jsp") requestURI.equals("/login.do") requestURI.equals(this.errorPage))return true; if(session != null && session.getAttribute(this.objName) != null && session.getAttribute("year") != null)return true;else return false;}
比较好的一个办法
//request.getSession(false)==null可以近似的判断是否过期:如果已经过期,那么返回的是null,但是当起一次请求,刚刚建立一个session的时候,上述方法也返回null //所以应该这个做 if(null==request.getSession(false)){ if(true==request.getSession(true).isNew()){ } else{ System.out.println("session已经过期"); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。