|
在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 + ",请求方式 :普通请求,需要重新登录!"); } return false; } return true; } public String getLogoutUrl() { // 使用默认值 if(StringUtils.isEmpty(logoutUrl)){ return DEFAULT_LOGOUT_URL; } return logoutUrl; } public void setLogoutUrl(String logoutUrl) { this }
(编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|