Javaweb项目session超时解决方案
在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。 0.需求 需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面。 1.引入 一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,即用户不操作30分钟以后,Session就会失效,此时用户就需要重新登录系统。 Session超时时间的配置主要的项目的web.xml中进行配置,如下: <span style="font-size: 14px;"> <!-- 设置Session超时时间 --> 2.请求的分类 现在的项目中请求主要分为两种:一种是普通请求,即发起请求返回视图和模型;另外一种是Ajax请求,主要返回模型数据。后端进行处理时就要根据不同的请求返回不同的内容。 对于普通请求,我们直接返回JavaScript脚本,脚本内容可以是将页面跳转到登录页面。 对于Ajax请求,则需要返回非200的状态码,这样ajax请求才会进入到error回调函数中以及全局的Ajax错误回调函数AjaxError中。 3.后端处理Session超时 后端采用SpringMVC的拦截器处理,这里为什么用拦截器呢?一方面,请求URL不能限制的太死,比如/*,这样对所有的请求都进行过滤是浪费资源的。另一方面,有些URL不需要进行拦截处理,比如到登录页面的请求肯定是不能拦截,要不然会循环重定向。再一方面,我们只需要拦截控制器请求,其它请求不拦截。 下面看一下拦截器的实现: /** 通过获取Session中的User对象是否存在来判断Session是否超时,如果Session超时,则根据不同的请求方式进行返回。如果是普通请求,则直接返回JavaScript脚本,该脚本可以将页面跳转到其它URL。如果是Ajax请求,则返回401状态码,并且在返回的header中加入sessionTimeout,该数据将会在前端使用。 该拦截器在SpringMVC配置文件中的配置如下: <span style="font-size:14px;"><!-- MVC拦截器 --> <mvc:interceptors> <!-- Web登录拦截器 --> <mvc:interceptor> <mvc:mapping path="/web/**"/> <mvc:exclude-mapping path="/web/index"/><!-- 防止循环重定向到首页 --> <mvc:exclude-mapping path="/web/login"/> <mvc:exclude-mapping path="/web/logout"/> <mvc:exclude-mapping path="/web/doLogin"/> <bean class="com.woyi.mhub.interceptor.WebLoginInterceptor"/> </mvc:interceptor> </mvc:interceptors></span><span style="font-size:24px;"> </span> 4.前端处理Session超时 对于普通请求,后端返回的是JavaScript脚本,会立刻执行,这里前端不需要任何处理。 对于Ajax请求,后端返回401状态码,并在header中设置的sessionTimeout。这里使用jQuery的ajaxComplete回调函数处理,具体如下: // 实现ajax请求时判断Session是否失效 $(document).ajaxComplete(function(event,response,settings) { var sessionTimeout = response.getResponseHeader("SessionTimeout"); if(sessionTimeout != null && typeof sessionTimeout != "undefined" && sessionTimeout.length > 0){ // 这里写Session超时后的处理方法 } }); 好了,可以了,Session超时的用户都会得到处理。 总结 关于Javaweb项目session超时解决方案就到这里,希望对大家有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |