简述:
① Session 是存在于服务器内存中的
② 一个浏览器独享一个 Session 对象(这里的一个浏览器是指一个进程的浏览器)
③ Session 默认的生命周期是 30 分钟,可以自己设置
获取 Session :
如果没有创建 Session 时,会自动创建一个。
HttpSession session = request.getSession( );
HttpSession session = request.getSession( boolean );
// true 和空参数没有区别
// false 代表,如果当前没有 Session,就不用创建了
设置 Session 生命周期的方式:
① Tomcat 中的 Web.xml 设置
<session-config>
<session-timeout>30</session-timeout> 以分钟为单位
</session-config>
② 在单个 Web 应用中修改,Web.xml,同上
<session-config>
<session-timeout>30</session-timeout> 以分钟为单位
</session-config>
如果发生冲突,则以 Web 应用为准。
如果访问,或者修改了 Session 中的值,都会重置生命周期(与 Cookie 不同)。
③ session.setMaxInactiveInterval( 秒 )
如果在规定时间内,没有访问或者操作 Session,就会销毁,否则会重置。
Session 的销毁属于全部销毁,并不能单独设立一个属性值的生命周期,与 Cookie 不同。
④ session.invalidate( )
使 Session 失效,安全退出使用这个技术点。
⑤ session.removeAttribute( String )
删除单个元素
为什么不同浏览器会独享 Session?
浏览器访问 Session 原理图:
步骤4:返回 JSESSIONID 保存到本地浏览器的 Cookie,这个 Cookie 有效期是临时的,浏览器关闭后,此 Cookie 失效。这就是关闭浏览器后不能访问原 Session 的原因。
HTTP 截图:
第一次访问设置 Session 时的 HTTP 请求:↓
没有任何 Cookie 值
第一次访问 Session 时,返回的 HTTP 响应: ↓
发现返回了一个 Set-Cookie:JSESSIONID=123456
② 第二次再次访问同一个 servlet 时(没有关闭浏览器):↓
HTTP 请求,发送了 JSESSIONID 来获取 Session 对象
③ 重启浏览器访问相同 Servlet ,这个 保存 Session ID 的 Cookie 消失
HTTP 请求 ↓
HTTP 响应 ↓
发现得到不同的 Session,但是原来的 Session 不一定销毁,销毁时间取决于自己的生命周期
如何再关闭浏览器后再访问相同的 Session?
① 当服务器第一次给浏览器 ID 后,浏览器关闭,这个保存 ID 的 Cookie 也就消失了。
② 我们可以手动保存,用 Cookie 保存这个 ID,这样就可以做到关闭浏览器后,
只要这个 Cookie 没有消亡,就会返回 ID,得到 Session
③ 用 session.getId( ) 返回这个 Session 的 ID
④ 用 Cookie 存 ID 时,name 一定要和规定的一样,全部大写,JSESSIONID = ……
⑤ 当保存了 Cookie 后,重启浏览器再次访问时,HTTP 请求会把 Cookie 值传过去,返回原 Session 对象
如果浏览器禁用了 Cookie 会导致 Session 失效:
第一次访问 Session 时,返回的 Id 需要存放到 Cookie 中,但是浏览器禁用 Cookie,无法保存 Id,就导致原先的 Session失效。
如何实现 IE 禁用 Cookie 后,我们还可以继续使用 Session?
url 地址重写,在重写前,要访问一下 Session,之后就会自动把 JSESSIONID 通过 url 拼接过去。原理就是通过 url,把 ID 传到浏览器。
代码案例:↓
文件1:
编码url,自动将 Cookieid 封装到了 url
// 必须先访问 Session 才有 ID 值
HttpSession httpSession = request.getSession();
httpSession.setAttribute("name", "张三");
// 返回封装好了 ID 值的 url
String url = response.encodeRedirectURL("/SessionDemo/Demo2");
out.println("<a href='"+url+"'> 访问 Session </a>");
文件2:
不需要做任何的处理,自动的获取 ID 返回传来的 Session,方法内已经帮我们封装好了,不需要手动取出。
HttpSession httpSession = request.getSession();
String nameVal = (String) httpSession.getAttribute("name");
Session 销毁时间的讨论:
我们的 Session 生命周期如果是 30min,该 Session 不会随浏览器的关闭,而自动销毁。
关闭浏览器,服务器不会接收到任何通知,直到时间到了,才会销毁。而是到 30min 后,才会被服务器销毁。
所以我们要点击安全退出,销毁自己在服务器端的 Session
Session 的用途:
1. 购物车
2. 保存用户登录的信息
3. 将某些数据保存到 Session 中,供其他页面使用
4. 防止用户非法登录到某个页面
Cookie 和 Session 的比较:
1. 保存的位置
Cookie 存在客户端的 临时文件夹
Session 存在服务器的内存中,一个 Session 对象为一个用户浏览器服务
2. 安全性
Cookie 以明文方式存放,需要通过md5加密
Session在服务器内存中,较为安全
3. 网络传输量
Cookie 会传递信息给服务器
Session 的属性值不会给客户端
4. 生命周期
Cookie 是累计的,时间一过,就失效
Session 是间隔的,只要在时间期间内访问了,就会重新计算时间间隔
关闭浏览器后,并不是让 Session失效,而是存储 Session ID 的 Cookie 消失了,但是在内存中
还可能存在 Session,我们需要使用 invalidate 销毁 Session
5. 使用原则
Session 会占用服务器内存,因此不要向 Session 中存放过多过大的对象,会影响性能