锁定老帖子 主题:面试遇到的session过期问题,,求解
精华帖 (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等就无奈了 |
|
返回顶楼 | |
发表时间:2011-03-25
wwy_0918 写道 xuhang1128 写道 session有个getCreationTime方法,你和当前时间比较,这个我觉得放在filter里面去实现还是可以的,对于拦截到的请求,如果发现还有30s过期,可以放在request里面一个标记,然后到页面提示下
这个肯定得在客户端写,将创建时间返回,用javascript来判断当前时间和创建时间的时间间隔,然后setTimeout(tip,sec); 这个在理,主要思想就是每次请求,都要把访问时间和到期时间返回给前台,前台起一个定时器监控,到session到期30秒时,弹倒计时框,最后session到时跳转页面就行了。在服务器端做定时监控的话,返回不到前端,如果前端定时去请求后台的话,会改变session的CreationTime,所以只有这种方法最合适 |
|
返回顶楼 | |
发表时间:2011-03-25
charleehu 写道 败家小孩 写道 xuhang1128 写道 session有个getCreationTime方法,你和当前时间比较,这个我觉得放在filter里面去实现还是可以的,对于拦截到的请求,如果发现还有30s过期,可以放在request里面一个标记,然后到页面提示下
不错的想法,可是试试看 session的过期策略是,只要有请求到达,就会刷新计时器, 你遇到某个网站登录后点着点着网页就被踢出来了么? 用JS完全能做。 不想用js也可以实现自己的session 谢谢提醒 |
|
返回顶楼 | |
发表时间:2011-03-25
最后修改:2011-03-25
我觉得可以在session销毁的监听方法sessionDestroyed里处理这个,在session销毁的同时创建一个生命周期只有30秒的新session,然后服务器端推送30秒后过期的消息给客户端
不过前提是要有服务器端的推送 |
|
返回顶楼 | |
发表时间: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等就无奈了 这样子看起来方法很好,可每个页面都起一个定时器,会不会出问题呀,而且如果页面基于层的话,可能变的很乱的吧 |
|
返回顶楼 | |
发表时间:2011-03-25
以前遇到过类似问题,没搞定,上面给的方案都比较乱。
继续关注。 |
|
返回顶楼 | |
发表时间: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等就无奈了 这样子看起来方法很好,可每个页面都起一个定时器,会不会出问题呀,而且如果页面基于层的话,可能变的很乱的吧 也是觉得这样出现问题的几率很大 |
|
返回顶楼 | |
发表时间:2011-03-25
我刚才试了下,在服务器端验证应该也是可以的,通过session的getMaxInactiveInterval和getLastAccessedTime的比较来判断session过去,客户端的访问不会刷新session的创建时间,只是会刷新session的上次访问时间
|
|
返回顶楼 | |
发表时间:2011-03-25
觉得前台页面js控制 是必须的
假如 我打开了一个页面 然后什么都不操作 当然也就不会跟后台进行交互 那么你设置什么filter有什么用? 并且很多用户操作也会延长session的生命周期. 封装一段小js代码,所有页面都引用下即可. |
|
返回顶楼 | |
发表时间: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实现 |
|
返回顶楼 | |