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超时时间 -->      <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超时解决方案就到这里,希望对大家有所帮助。

(0)

相关推荐

  • Javaweb使用cors完成跨域ajax数据交互

    跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告. cors 全称:Cross-Origin Resource Sharing 中文意思:跨域资源共享 它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而

  • JavaWeb Servlet中url-pattern的使用

    JavaWeb Servlet中url-pattern的使用 1.Sevlet和Filter的url-pattern相关说明 一个页面请求根据url-pattern只匹配一个最佳的Servlet,而根据web.xml的filter-mapping标签的先后顺序,将满足要求的一个或者多个过滤器生成一个FilterChain 2.url-pattern配置 配置web.xml文件,用于定义映射的含义: (1)."/"开头-->路径映射         (2)."*.do&q

  • web前端超出两行用省略号表示的实现方法

    web前端超出两行用省略号表示的实现方法 HTML <span class="GW_bod0112211"> 吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑加仑葡萄干500g包邮无籽,超大孕妇零食 </span> CSS span{ height: 40px; line-height: 20px; width: 300px; display: -webkit-box; -webkit-line-clamp:2

  • JavaWeb项目中dll文件动态加载方法解析(详细步骤)

    相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章. 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来实现一些JAVA不能实现的功能,或者是一些第三方dll插件.通常的做法是将这些dll文件复制到 %JAVA_HOME%\jre\bin\ 文件夹或者 应用中间件(Tomcat|Weblogic)的bin

  • Web技术实现移动监测的介绍

    Web技术实现移动监测的介绍 由上述引用语句可得出"移动监测"需要以下要素: 一个拥有摄像头的计算机用于判断移动的算法移动后的处理 注:本文涉及的所有案例均基于 PC/Mac 较新版本的 Chrome / Firefox 浏览器,部分案例需配合摄像头完成,所有截图均保存在本地. 对方不想和你说话,并向你扔来一个链接: 体验链接>> 综合案例 该案例有以下两个功能: 拍好 POST 后的 1 秒会进行拍照静止 1 秒后音乐会停止,产生移动会恢复播放状态 上述案例也许并不能直接

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • Javaweb项目session超时解决方案

    在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了. 0.需求 需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面. 1.引入 一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,

  • JavaWeb项目打开网页出现Session Error的异常解决方案

    这篇文章主要介绍了JavaWeb项目打开网页出现Session Error的异常解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 找到web.xml配置的原始配置的位置: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class&g

  • React项目中fetch实现跨域接收传递session的解决方案

    本次项目使用了react框架,同时使用fetch取代ajax作为获取接口数据的交互方法.本以为过程中应该不会有什么磕绊,没想到遇到了session丢失这个让人甚是苦恼的问题.期间本想换种方法来对接接口,但转念一想如果每次遇到问题都选择逃避,那么以后的编码之路只能越走越窄,所以还是决定坚持下去.好在经过一整天的摸索,总算是成功攻克了这个难关,下面就对这次问题的解决做个总结. 首先,为什么会出现postman接口调试正常而程序里fetch调用却出现session丢失的问题? 回顾fetch本身的特性

  • 详解SpringBoot中Session超时原理说明

    一:前言: 最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debug代码后发现session的超时时间是1800s.也就是说当1800秒内没有任何操作,session就会出现超时现象.那这个超时时间是如何设置的呢?然后该如何重新设置此超时时间呢?系统又如何判断session超时的呢?接下来就一一进行解答. 二:系统session超时时间如何默认的? 说明:获取session超时时间的方法为"request.getSess

  • webix+springmvc session超时跳转登录页面

    引言 最近做项目,发现ajax请求不能在服务器中直接重定向到登录页面.查了些资料发现jquery的ajax请求有人给出了方法.但是webix的ajax请求和jquery的有些区别.这里模仿jquery的处理方式实现webix的ajax请求session超时跳转. 具体的做法: 1.查看webix.js源码发现webix.ajax只有请求前的监听函数 "onBeforeAjax", 要做到获取返回状态跳转登录页面必须要有个返回的监听函数,但是源码没有.所以我修改了下源码,加了个返回的监听

  • 详解Java分布式Session共享解决方案

    分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息. 客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionid没有找到对应的数据那么服务器会创建一个新的sessionid并且响应给客户端. 分布式Sessio

  • java web项目Session获取不到问题及解决

    目录 java web项目Session获取不到 关于session的生命周期 前后端分离获取不到session问题 解决方案 java web项目Session获取不到 在servlet类中对Session进行了设置 但当servlet跳转到页面时 页面获取不到Session!!! 关于session的生命周期 Session保存在服务器端.Session在用户第一次访问服务器的时候自动创建.需要注意只有访问JSP.Servlet等程序时才会创建Session,只访问HTML.IMAGE等静态

  • springboot2中session超时,退到登录页面方式

    目录 session超时退到登录页面 1.首先在springboot中追加配置session的超时时间 2.登录成功接口中把用户信息追加session中 3.在WebMvcConfig中配置拦截规则和重定向规则 4.实现拦截器,先跳转到超时页面 5.在超时页面让用户等待几秒钟 session超时的问题 session超时退到登录页面 最近发现使用的工程居然没有session超时机制,功能太欠缺了,现在把追加方法分享出来,里面有一些坑,大家自由使用. 1.首先在springboot中追加配置ses

  • Shiro中session超时页面跳转的处理方式

    目录 session超时页面跳转的处理 问题描述 ajax请求超时处理 非ajax请求超时跳转 一个判断session是否过期的小技巧 1.session其实就是一个Map 2.session的过期时间是从什么时候开始计算的? 3.设置session的失效时间 4.如何判断session过没过期 session超时页面跳转的处理 问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个

  • JSP Session超时设置的实现方法

    JSP Session超时设置的实现方法 在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了. 设置Session超时时间方式: 方式一:  在web.xml中设置session-config如下: <session-config> <

随机推荐