在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。

0.需求

需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面。

1.引入

一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,即用户不操作30分钟以后,Session就会失效,此时用户就需要重新登录系统。

Session超时时间的配置主要的项目的web.xml中进行配置,如下:

60

COOKIE

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("

.append("window.location.href=\"")

.append(basePath).append(getLogoutUrl()).append("\";")

.append("");

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配置文件中的配置如下:

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 超时_Javaweb项目session超时解决方案相关推荐

  1. java session 作用范围_ssm项目session使用及其作用域问题

    这两天由于自己在前端用到ajax发起异步更新请求,发现ajax会暴露后端的接口地址,这个问题当然是避免不了的啦,前端都是明文.可怜于是就在百度.谷歌.QQ群里各种查询各种提问题,都说只能通过安全验证去 ...

  2. java cookie共享_JavaWeb的session及其共享技术

    原标题:JavaWeb的session及其共享技术 1.什么叫会话 一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样, ...

  3. java kafka分布式_JavaWeb项目架构之Kafka分布式日志队列

    架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了. kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由S ...

  4. java seo优化_JavaWeb 项目如果从技术选型的角度来做 Seo 优化

    很久以前就开始想这个问题了,一直不知道 Seo 这块怎么做,感觉针对 Java 项目 Seo 优化这块网上资料挺匮乏的,所以就厚着脸皮来问各位前辈. 问题 在下想知道开发一个 javaweb 项目如何 ...

  5. java web插件_javaweb项目插件实现机制

    如题,java开发web程序想实现插件机制有什么办法? 就比如:一个论坛,里面有签到,积分,第三方登录,编辑器选择等等的功能,现在我想把他们都抽出来,当成插件,论坛核心只保留用户的登录,注册,发帖,回 ...

  6. java成绩查询_JavaWeb项目第三次总结_成绩查询的实现

    查询图书的功能实现 如何知道浏览器往服务器传入的参数 1.在编写好查询页面后,使用火狐浏览器的friebug (全部->POST->参数) 2.编写GradeListServlet,重写d ...

  7. java 插件原理_javaweb项目插件实现机制

    如题,java开发web程序想实现插件机制有什么办法? 就比如:一个论坛,里面有签到,积分,第三方登录,编辑器选择等等的功能,现在我想把他们都抽出来,当成插件,论坛核心只保留用户的登录,注册,发帖,回 ...

  8. Session超时管理以及Session实现自动登录——java web实验

    一.Session超时管理 在实际网站用户登陆后,在浏览其他页面过程中,可能中间会有其他事情停顿,一段时间内没有对该网站页面再次发送请求访问,待到一定时间过后(即保存登陆用户信息的session超时) ...

  9. java中session对象登录_JavaWeb中Session对象的学习笔记

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  10. Java Web 之Token+Cookie+Session

    发展史: 1. 早期的WEB基本上就是文档的浏览而已,服务器不需要记录谁在某个时间都浏览了什么文档,每次请求都是全新的HTTP协议. 2. 随着交互式WEB应用的兴起,例如在线购物网站,需要登录的网站 ...

最新文章

  1. ActionScript 3操作XML 详解
  2. GAN网络生成:感知损失(Perceptual Losses)
  3. 2020年,知识图谱都有哪些研究风向?
  4. spring@PropertySource用法
  5. Eclipse运行Applet没有显示图片,getCodeBase,getDocumentBase
  6. ISA Server 2006 升级到 TMG2010
  7. ElasticSearch 之中文分词器
  8. 内部类及内部类什么时候使用
  9. Django 组件- 中间件
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的水果蔬菜商城管理系统
  11. 单片机51keil编程流程
  12. SCADA和三大工业控制系统PLC、DCS、FCS
  13. 【Adobe安装】安装程序在Adobe Reader XI -Chinese Simplelified 安装完成之前被中断,错误代码150210
  14. Error: Cannot find module ‘webpack‘
  15. r 对一列计数_根据另一列对项目进行计数
  16. iOS中-Qutarz2D详解及使用
  17. CF506 C Mr. Kitayuta vs. Bamboos (贪心)
  18. python数据逆透视_利用Python实现数据逆透视
  19. JavaWeb项目-快递代领-需求分析(二)-软件工程-小组项目
  20. 如何用Windows自带画图工具将图片设置成透明背景

热门文章

  1. 计算机毕业设计——基于SSM框架的公寓租房管理系统的设计与实现
  2. Altium Designer 17 安装破解版详细教程
  3. 傅里叶光学MATLAB编程系列【1】基本函数
  4. [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中
  5. SketchUp最适用新手的二十多款SU插件
  6. 手把手教你安装华为网络模拟器及设备注册
  7. OOA、OOD、OOP 区别与思想
  8. Helen人脸数据集生成人脸分割
  9. 大学生个人网站作业 超简单DIV CSS个人网页成品 简单个人网站作业模板 HTML个人网页设计下载 简约黑白色个人主页
  10. USB2.0 EMC标准设计