Session过期自动跳转

 这篇文章我会说的很多,很杂,但主要还是关于session过期的问题

 

本文针对session过期但是由于项目情况比较特殊,一般判断无法解决,所以我会阐述几种我用过的方式。

 

1. session过期情况---这是最简单的一种,前台是一个在无点击的情况下不会产生前后交互的界面

    这种情况下最简单的方式就是首先设置session失效时间,其次设置过滤器(拦截器),拦截所有请求,

    如果过了session失效时间,前台用户进行操作,可以在过滤器中直接进行重定向。

    注意:

    这里我要说个小问题:很多人说遇到过 Cannot forward after response has been committed 问题,

    这问题是在response发送关闭后有发送一次。很多说在response.redirect  后边加return就可以解决了,

    不错这是解决办法,但在filter的dofilter中一定注意一点,filter的super.doFilter 和 filterChain.doFilter 

    一定要和你的重定向语句不能串行化执行,用判断分开执行,只要保证重定向之后没有了response的操作

    就不会出现该问题了。

 

 

 

2. session过期情况 --- 前台定时ajax (但使用的地方不多,一个界面也就1-2个,主要供server推送或者是显   

    示最热物品之类的)这种情况是最好的(我最喜欢的), 这种情况下我基本使用方式:

 

 

 

    1. 在过滤器(拦截器)中进行处理,当用户第一次访问时候,把当前系统时间放到session中oldtime(long  

 

        值即可),之后每次有请求经过时候,判断当前的请求是不是ajax请求,如果是则把当前系统存session

 

        中newtime,如果不是则把当前时间放到oldtime中,这样只要new-old > 一个值 ,就证明用户在多长时

 

        间没操作,这时候我们可以手动让session失效,并让前台进行跳转。(就是记录用户第一次时间和最

        后一次时间,做差)

 

 

 

 

        后台:

 

HttpSession session = request.getSession();
long now =  System.currentTimeMillis()
session.setAttribute("newtime", now);
if("XMLHttpRequest".equals(request.getHeader("x-Requested-With"))){
    if(now - (Long)session.getAttribute("oldtime") > 30000000){
        response.getWriter().write(  
             "<script>window.location.href='login.html'</script>");
        return;
     }
}
session.setAttribute("oldtime", now);
chain.doFilter(request,response);

 

 

 

   前台:

 

$(function(){
   setInteval(function(){
       $.post("getMessage", function(data){
            //判断是不是过期,如果过期可以返回的js     
            //<script>window.location.href='login.html'</script>
            //通过$("html").html("*****上边的串*****");进行跳转
            //如果没过期,就该干嘛干嘛。
        },"text");
    }, 300000);
});

 

 

 

注意:这种方式有很大局限性, 主要是前台编写不可以应用大量的ajax,否则不能判断是不是用户操作。

 

 

3.  session过期情况----前台有大量ajax(就类似我现在做的项目,前台95%是利用ajax)其实我现在项目中有很  

 

     多是实时更新的,一个见面中一个模块是每过3秒更新一次,另一个是每过5分钟更新一次而且大部分的点

 

     击事件都是ajax,因为前台需要异步形式。(其实我都快泪奔了......)这时候session本质来讲是永远不会

     过期的,除非session丢了。这种情况只能在某个时间点让前台把所有定时器关掉,比如说1小时定时器全

     关,在利用web.xml把session超时时间设置成10分钟,如果在十分钟内没请求,session失效,但是如何

     让前台自动跳转哪?

     其实还是需要一个定时器,(当然如果用长连接也可以,但是我不怎么会使),每过1小时零20分钟访问

     后台一次判断session(一定要在session预定失效时间后请求)。来进行跳转。

 

     毕竟没有请求,前台自动跳转,这实在是不符合基本的业务逻辑

 

 

最后我说一下 HttpSessionListener这个接口有两个函数,一个是在监听session创建一个是监听session销毁的

该接口主要还是功能还是判断当前在线人数的, 监听器这种东西主要还是针对与某个动作触发后应该作什么反映。

在web中请求和响应这套业务逻辑中,listener在我看来并不应该属于这里。

 

 

亲们,如果谁有好的建议,改进措施,我的内容写错,请及时提出哈!另外有什么别的办法,请回复给我。

 

iteye发表工具真应该重做了,不太智能,呵呵

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值