本文主要介绍Javaweb项目的会话超时解决方案。解决方案分类明确,内容详细。有需要的朋友可以参考一下。
在Java Web开发中,Session给我们提供了很多便利。会话在浏览器和服务器之间维护。超时意味着在浏览器和服务器之间创建会话。因为客户端长时间没有和服务器交互(睡眠时间),服务器会破坏这个会话,当客户端再次和服务器交互时,之前的会话就不存在了。
0.需求
有必要拦截所有/web/**请求,并在会话超时时跳转到登录页面。
1.引入
一般来说,会话超时会在项目使用过程中进行配置。如果未配置,默认值为30分钟,即用户30分钟不操作后,会话将失效,用户需要重新登录系统。
会话超时在主项目的web.xml中配置,如下所示:
span style= font-size:14px;!-设置会话超时-
会话配置
!-分钟-
会话超时60/会话超时
!-删除URL上显示的jsessionid,以防止打开选项卡页面时出现JS错误-
跟踪模式cookie/跟踪模式
/session-config/span span style= font-size:24px;
/span
2.请求的分类
当前项目中有两种请求:一种是普通请求,即发起请求返回视图和模型;另一个是Ajax请求,主要返回模型数据。后端处理会根据不同的请求返回不同的内容。
对于普通请求,我们直接返回JavaScript脚本,可以跳转页面到登录页面。
对于ajax请求,需要返回200以外的状态码,这样Ajax请求才能进入错误回调函数和全局AJAXError回调函数AjaxError。
3.后端处理Session超时
后端SpringMVC用于拦截器处理。为什么在这里使用拦截器?一方面,请求URL不能限制太多,比如/*,浪费资源过滤所有请求。另一方面,有些网址不需要拦截。比如对登录页面的请求一定不能被拦截,否则会被循环重定向。另一方面,我们只需要拦截控制器请求,其他请求不会被拦截。
让我们来看看拦截器的实现:
/**
* Web端登录拦截器
*处理请求时会话失败,包括Ajax请求和普通请求。
* @ClassName WebLoginInterceptor
* @作者张顺
* @日期2016年10月20日上午11点14分52秒
*/
公共类WebLoginInterceptor扩展HandlerInterceptorAdapter{
/**
*日志对象
*/
private Logger Logger=Logger factory . get Logger(weblogininterceptor . class);
/**
*默认注销URL
*即会话超时后,会向该地址发送一个请求,该请求仅对普通请求有效。
*/
private static final String DEFAULT _ LOGOUT _ URL=/web/LOGOUT ;
/**
*注销URL
*/
私有字符串logoutUrl
@覆盖
公共布尔预处理(HttpServletRequest请求,HttpServletResponse响应,
对象处理程序)引发异常{
user user=session utils . getuserfromrequestacrosscas(请求);
string uri=request . getrequest uri();
if(user==null){
response . set content type( text/html;charset=UTF-8 );
if(request . get header( x-requested-with )!=空
request . get header( x-requested-with )。equalsIgnoreCase( XMLHttpRequest ){
//Ajax请求,前一段按照这个头处理。
response . set header( Session time out ,会话超时,您需要重新登录!);
//返回未经验证的状态代码(401)
response.setStatus(HttpStatus。authorized . value());
Logger.debug(请求路径: uri ,请求方法:Ajax请求,会话超时,再次登录!);
}否则{
//普通请求
string path=request . getcontextpath();
string buffer basePath=new string buffer()。append(request.getScheme())。追加(://)。append(request.getServerName())。追加(:)。append(request.getServerPort())。追加(路径)。追加(/);
string buffer responseStr=new string buffer()。append( htmlheaderscript type= text/JavaScript )。append(window.location.href= )。追加(基本路径)。append(getLogoutUrl()).追加("");)。append(/script/header/html );
response.getWriter().写(responsestr。tostring());
logger.debug(请求路径: uri ,请求方式:普通请求,会话超时,需要重新登录!);
}
返回错误的
}
返回真实的
}
公共字符串getLogoutUrl() {
//使用默认值
if(字符串实用程序。isempty(注销URL)){
返回默认注销网址
}
返回logoutUrl
}
public void setLogoutUrl(String logoutUrl){
这
}
通过获取会议中的用户对象是否存在来判断会议是否超时,如果会议超时,则根据不同的请求方式进行返回。如果是普通请求,则直接返回Java脚本语言脚本,该脚本可以将页面跳转到其它网址。如果是埃阿斯请求,则返回401状态码,并且在返回的页眉中加入sessionTimeout,该数据将会在前端使用。
该拦截器在SpringMVC配置文件中的配置如下:
span style= font-size:14px;!- MVC拦截器-
mvc:拦截器
!-网络登录拦截器-
mvc:拦截器
mvc:映射路径=/web/**/
MVC:exclude-mapping path=/web/index /!-防止循环重定向到首页-
MVC:exclude-mapping path=/web/log in /
MVC:exclude-mapping path=/web/logout /
MVC:exclude-mapping path=/web/doLogin /
bean class= com。伊沃。mhub。截击机。拦截器中的网络日志/
/mvc:拦截器
/MVC:interceptors/span span style= font-size:24px;
/span
4.前端处理Session超时
对于普通请求,后端返回的是Java脚本语言脚本,会立刻执行,这里前端不需要任何处理。
对于埃阿斯请求,后端返回401状态码,并在页眉中设置的会话超时。这里使用jQuery的ajaxComplete回调函数处理,具体如下:
//实现创建交互式、快速动态网页应用的网页开发技术请求时判断会议是否失效
$(文档)。ajaxComplete(函数(事件、响应、设置){
var会话超时=响应。getresponse标头(“会话超时”);
if(sessionTimeout!=会话超时的空类型!=未定义会话超时。长度0){
//这里写会议超时后的处理方法
}
});
好了,可以了,会话超时的用户都会得到处理。
总结
关于Javaweb项目会议超时解决方案就到这里,希望对大家有所帮助。