Javaweb项目中session出现超时如何解决

Javaweb项目中session出现超时如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在凤泉等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都网站建设 网站设计制作按需定制网站,公司网站建设,企业网站建设,品牌网站建设,网络营销推广,外贸营销网站建设,凤泉网站建设费用合理。

在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("
");
                                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超时后的处理方法 
 } 
}); 

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


当前文章:Javaweb项目中session出现超时如何解决
标题来源:http://scyanting.com/article/jhcpsp.html