Javaweb项目session超时解决方案
发布时间 - 2026-01-11 03:20:38 点击率:次在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超时时间 -->
<session-config>
<!-- 分钟 -->
<session-timeout>60</session-timeout>
<!-- 去除URL上显示的jsessionid, 防止打开Tab页时出现JS错误 -->
<tracking-mode>COOKIE</tracking-mode>
</session-config></span><span style="font-size:24px;">
</span>
2.请求的分类
现在的项目中请求主要分为两种:一种是普通请求,即发起请求返回视图和模型;另外一种是Ajax请求,主要返回模型数据。后端进行处理时就要根据不同的请求返回不同的内容。
对于普通请求,我们直接返回JavaScript脚本,脚本内容可以是将页面跳转到登录页面。
对于Ajax请求,则需要返回非200的状态码,这样ajax请求才会进入到error回调函数中以及全局的Ajax错误回调函数AjaxError中。
3.后端处理Session超时
后端采用SpringMVC的拦截器处理,这里为什么用拦截器呢?一方面,请求URL不能限制的太死,比如/*,这样对所有的请求都进行过滤是浪费资源的。另一方面,有些URL不需要进行拦截处理,比如到登录页面的请求肯定是不能拦截,要不然会循环重定向。再一方面,我们只需要拦截控制器请求,其它请求不拦截。
下面看一下拦截器的实现:
/**
* Web端登录拦截器
* 处理请求时Session失效的问题,包含Ajax请求和普通请求
* @ClassName WebLoginInterceptor
* @author zhangshun
* @date 2016年10月20日 上午11:14:52
*/
public class WebLoginInterceptor extends HandlerInterceptorAdapter{
/**
* 日志对象
*/
private Logger logger = LoggerFactory.getLogger(WebLoginInterceptor.class);
/**
* 默认注销URL
* 即Session超时后,发起请求到此地址,只对普通请求有效
*/
private static final String DEFAULT_LOGOUT_URL = "/web/logout";
/**
* 注销URL
*/
private String logoutUrl;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
User user = SessionUtils.getUserFromRequestAcrossCas(request);
String uri = request.getRequestURI();
if(user == null){
response.setContentType("text/html;charset=UTF-8");
if(request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
// Ajax请求, 前段根据此header进行处理
response.setHeader("sessionTimeout", "Session time out, you need relogin !");
// 返回未认证的状态码(401)
response.setStatus(HttpStatus.UNAUTHORIZED.value());
logger.debug("请求路径:" + uri + ", 请求方式 :Ajax请求, Session超时, 需要重新登录!");
}else{
// 普通请求
String path = request.getContextPath();
StringBuffer basePath = new StringBuffer()
.append(request.getScheme())
.append("://")
.append(request.getServerName())
.append(":")
.append(request.getServerPort())
.append(path)
.append("/");
StringBuffer responseStr = new StringBuffer()
.append("<html><header><script type=\"text/javascript\">")
.append("window.location.href=\"")
.append(basePath).append(getLogoutUrl()).append("\";")
.append("</script></header></html>");
response.getWriter().write(responseStr.toString());
logger.debug("请求路径:" + uri + ",请求方式 :普通请求, Session超时, 需要重新登录!");
}
return false;
}
return true;
}
public String getLogoutUrl() {
// 使用默认值
if(StringUtils.isEmpty(logoutUrl)){
return DEFAULT_LOGOUT_URL;
}
return logoutUrl;
}
public void setLogoutUrl(String logoutUrl) {
this
}
通过获取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超时解决方案就到这里,希望对大家有所帮助。
# java
# session
# 超时跳转
# 超时
# session解决方案
# Java中设置session超时(失效)的三种方法
# JavaWeb Session失效时间设置方法
# 设置session有效时间的三种方式
# 拦截器
# 后端
# 回调
# 跳转到
# 的是
# 客户端
# 重定向
# 就会
# 好了
# 将会
# 不需要
# 就不
# 是由
# 才会
# 两种
# 长时间
# 并在
# 只需要
# 时就
# 看一下
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
教你用AI润色文章,让你的文字表达更专业
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
JavaScript如何实现路由_前端路由原理是什么
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel如何使用.env文件管理环境变量?(最佳实践)
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel如何使用模型观察者?(Observer代码示例)
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
郑州企业网站制作公司,郑州招聘网站有哪些?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何在万网自助建站中设置域名及备案?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
黑客如何利用漏洞与弱口令入侵网站服务器?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
Android利用动画实现背景逐渐变暗
Laravel观察者模式如何使用_Laravel Model Observer配置
详解Huffman编码算法之Java实现
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何在自有机房高效搭建专业网站?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
北京企业网站设计制作公司,北京铁路集团官方网站?
如何快速重置建站主机并恢复默认配置?
详解Android中Activity的四大启动模式实验简述
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Laravel如何优化应用性能?(缓存和优化命令)
如何在建站主机中优化服务器配置?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何正确下载安装西数主机建站助手?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
java获取注册ip实例
Python3.6正式版新特性预览
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
高性能网站服务器部署指南:稳定运行与安全配置优化方案

