请选择 进入手机版 | 继续访问电脑版

在点击退出帐号,以及直接关闭浏览器时 ;如何将session里的数据序列化的思

[复制链接]
实现的大抵思路是 :
一. 欣赏器关闭 :
1. 用js的beforeunload来触发动作 ; [不当,原因见底部方法]
原因 : 用户脱离页面(关闭、刷新、跳转其他页面)便会触发 ;
2. 如 : 通过json给servlet发送欣赏器关闭消息;
3. servlet吸收到关闭通知 , 调用req.getSession().invalidate()销毁session;
4. 关于序列化操纵 , 在监听器里实现;
替代方法一 :


  • 不举行处置处罚 , 让session失效时, 自己触发序列化代码 ;
  • 这样会存在问题 : 用户关闭欣赏器 , 再次登录时 , 这样会存在两个session,后者会覆盖前者 , 显着是不当的的 , 会造成数据覆盖 .
  • 想到的方案是 : 做一个session的记录池(登录时) , key为userName,value为sessionID ; 在登录时,先举行name比对 ,如果存在直接取出session来用 ; 否则才反序列化对象 ;
  • 根据sessionID获取session管理方案
  • 登录信息放在hashmap里, hashmap放在ServletContext.Attribute中.
替代方案二 [ 转载方法 ] :https://www.cnblogs.com/nextgg/p/session.html
联合cookie思路不错 , 转头测试下 ;
手动添加cookie,生存JSESSIONID信息 Cookie cookie = new Cookie(“JSESSIONID”, session.getId()); cookie.setMaxAge(60*30);//设置cookie的生命周期为30min
-首先,session的声明周期是可以自己来设置的,默认的是30分钟,那么当我们关闭欣赏器之后,这个欣赏器对应的session实在还没有消亡,(如果我们需要它消亡的话,我们可以调用invalidate方法,这也是网站中的安全退出常见操纵之一)。既然没有消亡,为什么关闭欣赏器之后,我们就访问不到了呢?那是因为cookie中的JSESSIONID信息没有了,不会自动携带这个session信息了,服务器找不到对应的session,就会自动添加新的session,这个新添加的session显然不是我们需要的。所以,我们就可以使用cookie来实现这个需求。只要我们手动为cookie中添加JSESSIONID信息,那么不管你的欣赏器是否关闭,我的cookie中都会携带JSESSION信息,这样的话,服务器就一定可以或许找到对应的session,而不会重新创建一个新的session,这样只要session没有消亡,就一定可以访问到对应的session。
针对上述方案二 , 细细琢磨了下,实在还不完善,会存在一个问题:


  • 如果客户切换账号 , 获取的是上个帐号的sessionID , 显着是个BUG ;
  • 除非服务器要举行判定才气确定 ; 但是sessionID又没有标注属于哪个userName的 , get不到数据 , 应该是不当的 !
  • 方案一现在还存在一个问题,待管理 : 如果欣赏器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,都会生成一个新的session对象。[这个大概在登录时 , 做判定是否开启了cookie , 未开启就接纳URL带sessionID的形式; 大概强制提醒需要开启cookie]
譬如 : 方案二做如下完善 ;

  • 登录时 , 将name和sessionID生存在cookie中,时效为30分钟 ;
  • 且登录有前置判定 : 如果登录userName和cookie中的userName相同,就调用cookie中的 sessionID给他继续用 , 否则就重新分配id ;
  • 但问题是 : 如果两个帐号间 反复切换登录 , 那么session中就存在多份 , 导致数据钝化时 , 后者会覆盖前面的数据 .
  • 有大概 , 是跨硬件登录帐号的话呢 ? 雷同问题更加显着 .
  • 感觉,这个匹配放在服务端来判定 , 更安全.
- 关于如何将已存的sessionID赋值给请求头[即手动分配一个sessionID给欣赏器] ;
  1. // 消息头 : Cookie  JSESSIONID=3050E29D9BB7D9371EE8D44ACA27630D// 设置COOKIE中的SESSIONIDresp.setHeader("Set-Cookie","JSESSIONID="+req.getSession().getId()); // req.getSession().getId()要替换为user之前用的sessionID;
复制代码
二. 点击"退出帐号"
5. 直接销毁session;
6. 关于序列化操纵 , 在监听器里实现;
三. session逾期失效时 :
7. 通过HttpSessionListener监听sessionDestroyed(),销毁时 ;
8. 前置判定null != userName ;
9. 执行session中的数据序列化操纵(如生存到数据库) ;
================
关于欣赏器奔溃问题 , 未测试 ;
待测试后 , 再追加说明 ;
如有不当的地方请指出 , 有更好的方法 , 也请留言告知 .
======================
unload() 方法在 jQuery 版本 1.8 中被废弃,在 3.0 版本被移除。
改用下面这段JS代码
弃用 , 不当 !
  1. // 只有屏幕和用户互动事后,用户脱离页面(关闭、刷新、跳转其他页面)才会触发$(window).bind("beforeunload",function(){        alert("关闭欣赏器") ; // 这个无效        loadtext(); // 触发相应代函数有效});
复制代码
来源:https://blog.csdn.net/qq_33949023/article/details/112054989
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )