论坛首页 招聘求职论坛

面试遇到的session过期问题,,求解

浏览 35459 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-03-25  
1、建个filter
2、只要response的Content-Type是text/html,且request里没有X-Request-With: XMLHTTPRequest,则视为一次正常的HTML请求
3、对于HTML请求,分析response,找到head部分,插入一段script
<script>
    // IE用attachEvent
    window.addEventListener('load', function() {
        // SESSION_EXPIRE_MILLI就是session过期时间,用毫秒表示
        // - 30 * 1000就是提前30秒提醒
        setTimeout(tipForSessionExpire, SESSION_EXPIRE_MILLI - 30 * 1000);
    }, flase);

    // 这个函数能放到外部js中,与全项目的common.js之类的通用更好
    function tipForSessionExpire() {
        // ...
    }
</script>

剩下的问题就是,如果有img/iframe/ajax/@font-face/background-image/object等请求的话,一样会延长Session的生命周期,这个基本无解,AJAX请求可以包装一下,刷新一下计时器,其他的动态创建的img/object等就无奈了
0 请登录后投票
   发表时间:2011-03-25  
wwy_0918 写道
xuhang1128 写道
session有个getCreationTime方法,你和当前时间比较,这个我觉得放在filter里面去实现还是可以的,对于拦截到的请求,如果发现还有30s过期,可以放在request里面一个标记,然后到页面提示下

这个肯定得在客户端写,将创建时间返回,用javascript来判断当前时间和创建时间的时间间隔,然后setTimeout(tip,sec);


这个在理,主要思想就是每次请求,都要把访问时间和到期时间返回给前台,前台起一个定时器监控,到session到期30秒时,弹倒计时框,最后session到时跳转页面就行了。在服务器端做定时监控的话,返回不到前端,如果前端定时去请求后台的话,会改变session的CreationTime,所以只有这种方法最合适
0 请登录后投票
   发表时间:2011-03-25  
charleehu 写道
败家小孩 写道
xuhang1128 写道
session有个getCreationTime方法,你和当前时间比较,这个我觉得放在filter里面去实现还是可以的,对于拦截到的请求,如果发现还有30s过期,可以放在request里面一个标记,然后到页面提示下


不错的想法,可是试试看


session的过期策略是,只要有请求到达,就会刷新计时器, 你遇到某个网站登录后点着点着网页就被踢出来了么?

用JS完全能做。 不想用js也可以实现自己的session

谢谢提醒
0 请登录后投票
   发表时间:2011-03-25   最后修改:2011-03-25
我觉得可以在session销毁的监听方法sessionDestroyed里处理这个,在session销毁的同时创建一个生命周期只有30秒的新session,然后服务器端推送30秒后过期的消息给客户端
不过前提是要有服务器端的推送
0 请登录后投票
   发表时间:2011-03-25  
int08h 写道
1、建个filter
2、只要response的Content-Type是text/html,且request里没有X-Request-With: XMLHTTPRequest,则视为一次正常的HTML请求
3、对于HTML请求,分析response,找到head部分,插入一段script
<script>
    // IE用attachEvent
    window.addEventListener('load', function() {
        // SESSION_EXPIRE_MILLI就是session过期时间,用毫秒表示
        // - 30 * 1000就是提前30秒提醒
        setTimeout(tipForSessionExpire, SESSION_EXPIRE_MILLI - 30 * 1000);
    }, flase);

    // 这个函数能放到外部js中,与全项目的common.js之类的通用更好
    function tipForSessionExpire() {
        // ...
    }
</script>

剩下的问题就是,如果有img/iframe/ajax/@font-face/background-image/object等请求的话,一样会延长Session的生命周期,这个基本无解,AJAX请求可以包装一下,刷新一下计时器,其他的动态创建的img/object等就无奈了



这样子看起来方法很好,可每个页面都起一个定时器,会不会出问题呀,而且如果页面基于层的话,可能变的很乱的吧
0 请登录后投票
   发表时间:2011-03-25  
以前遇到过类似问题,没搞定,上面给的方案都比较乱。
继续关注。
0 请登录后投票
   发表时间:2011-03-25  
miaofm 写道
int08h 写道
1、建个filter
2、只要response的Content-Type是text/html,且request里没有X-Request-With: XMLHTTPRequest,则视为一次正常的HTML请求
3、对于HTML请求,分析response,找到head部分,插入一段script
<script>
    // IE用attachEvent
    window.addEventListener('load', function() {
        // SESSION_EXPIRE_MILLI就是session过期时间,用毫秒表示
        // - 30 * 1000就是提前30秒提醒
        setTimeout(tipForSessionExpire, SESSION_EXPIRE_MILLI - 30 * 1000);
    }, flase);

    // 这个函数能放到外部js中,与全项目的common.js之类的通用更好
    function tipForSessionExpire() {
        // ...
    }
</script>

剩下的问题就是,如果有img/iframe/ajax/@font-face/background-image/object等请求的话,一样会延长Session的生命周期,这个基本无解,AJAX请求可以包装一下,刷新一下计时器,其他的动态创建的img/object等就无奈了



这样子看起来方法很好,可每个页面都起一个定时器,会不会出问题呀,而且如果页面基于层的话,可能变的很乱的吧


也是觉得这样出现问题的几率很大
0 请登录后投票
   发表时间:2011-03-25  
我刚才试了下,在服务器端验证应该也是可以的,通过session的getMaxInactiveInterval和getLastAccessedTime的比较来判断session过去,客户端的访问不会刷新session的创建时间,只是会刷新session的上次访问时间
0 请登录后投票
   发表时间:2011-03-25  
觉得前台页面js控制 是必须的

假如 我打开了一个页面 然后什么都不操作
当然也就不会跟后台进行交互
那么你设置什么filter有什么用?

并且很多用户操作也会延长session的生命周期.

封装一段小js代码,所有页面都引用下即可.
0 请登录后投票
   发表时间:2011-03-25  
xuhang1128 写道
我刚才试了下,在服务器端验证应该也是可以的,通过session的getMaxInactiveInterval和getLastAccessedTime的比较来判断session过去,客户端的访问不会刷新session的创建时间,只是会刷新session的上次访问时间


session.getLastAccessedTime()得到最后一次访问关联这个session的请求,

getCreationTime()得到session的创建时间


getMaxInactiveInterval()返回用户不活动session有效的最长时间

你可用(当前时间-session.getLastAccessedTime())<getMaxInactiveInterval()就代表session还没过期,
你可以判断(当前时间-session.getLastAccessedTime())即将等于getMaxInactiveInterval()的时候就是session即将过期!

前台js实现
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics