一 . 理解 Session 原理
Session 机制是一种在 web 服务器上用于保存会话信息的机制,一般使用散列表( HashTable 、 HashMap 等)。
会话可以理解为浏览器和服务器的的通信过程,一次会话期间, session 对象应该是不会变化的,除非某些操作使得服务器上改变了 session 对象。
WEB 服务器是如何保证一次会话 session 不变的呢。每次请求都有一个隐藏的参数会传递到服务器,这个参数就是 sessionid ,这个值会保存在 cookie 中,如果禁用了 cookie ,则会同 url 重写的方式,跟在 url 地址后面。
服务器收到这个 sessionid ,每次都会进行比较是不是和现存在的是同一个,作出不同的判断。
二 .session 使用场景
针对同一域中的操作比较:
新窗口打开方式 IE6 IE8
CTRL+N 共享 session 共享 session
winodw.open 共享 session 共享 session
链接 共享 session 共享 session
打开 IE 新建 session 共享 session
创建标签页 无 共享 session
1. 打开 IE 时多个浏览器窗口(不是标签页)
在 IE6 中,不同方式会有不同的行为,在 IE8 中,不同窗口共享一个会话。如果要使 IE8 和 IE6 在打开 IE 时,表现一致,在 IE8 启动参数中加入 -nomerge 。
2. 同一用户同时打开多个相同的页面
此时浏览器会共享 session ,如果这个页面操作,服务器上有更新 session 对象的信息,可能会导致 session 信息会被覆盖。举例:
打开页面 page.jsp 后,输入信息,然后提交,提交时从 session 取 page 的值。
假设某页面 page.jsp 每次打开之后,都会根据数据设置 session 。
第一次的数据值为 value1 :
session.setAttribute("page","value1");
第二次的数据值为 value2 :
session.setAttribute("page","value2");
同时打开两个 page.jsp ,第一次打开之后未提交,第二次打开之后也未提交。
此时,如果回到第一个页面,并提交,取到的 page 值是 value2 ,数据有异常。
回到第二个页面,并提交,取到的 page 值是 value2 ,数据正常。
三 . 规避措施
1. 禁止同一页面同时打开多次
2.1 条件不满足的情况下,不使用 session 保存数据,考虑使用页面表单的 hidden 域传值
3. 对于 GET 请求,可以使用 URL 重写,加入参数,敏感信息需要加密不能使用
本文同步发表于www.devtutor.com(西蜀博客-关注互联网、移动互联网的技术博客)
本文作者:coolfiry
本文出处:www.devtutor.com
声明: 本文可以不经作者同意, 任意复制, 转载, 但请保留文章最后3行的作者, 出处,以及声明信息. 谢谢.