一、会话概述

二、cookie

三、session

Cookie 技术“可以”将用户信息保存在各自的浏览器中,并且可以在多次请求中实现数据的共享。
但是,如果传递的信息比较多,使用cookie技术显然会增大服务器程序的处理的难度,这时,可以使用session技术。session是一种将会话数据保存在服务器端的技术

1、解读:

单纯cookie 技术是可以实现将会话数据全部存储在浏览器端。(客户端可以实现购物车将用户会话数据完全放入cookie对象中)
② 随着技术的迭代更新,为了避免cookie携带大量数据而且还增大服务器端程序处理难道(因为cookie存储k-v都是String,要反序列化解析),推出了session技术,将会话数据保存在服务器端。(服务器端:实现购物车将用户会话数据完全放入session对象中)
③ 使用session技术之后如何识别当前用户与会话数据匹配绑定,要借助于Cook‘’。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。ie技术使客户端保存服务器端JSESSIONID数据。(客户端/服务器端:cookie + session)

2、细节:

① session 由阿帕奇组织提供标准化接口规范 javax.servlet.http.HttpSession;
② session 的生命周期由servlet容器管理;
③ servlet 容器随着不同PC 中 不同浏览器的访问, 创建不同的session对象存储在服务器端内存中,大量请求造成服务器端大量内存资源消耗直至OOM;

3、session 超时管理:

① session的生命周期伴随服务器的生命周期,伴随着应用的创建与销毁。
session的创建并不是客户端访问web应用资源就会被创建,而是当客户端第1次访问 某个能开启会话功能的资源时,Web服务器就会创建一个与该客户端对应的HttpSession对象
③ 在HTTTP协议中,Web服务器无法判断当前客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭。所以即使客户端已经离开或关闭了浏览器,Web服务器还要保留与之对应的HttpSession对象。随着时间的推移,这些不再使用的HttpSession对象会在Web服务器中积累的越来越多,从而使Web服务器内存耗尽。

为了解决上面的问题:web服务器采用了“超时限制”策略机制来判断客户端是否还在继续访问。在一定时间内,如果某个客户端一直没有请求访问,那么,Web服务器就会认为客户端已经结束请求,并且将与该客户端会话所对应的HttpSession对象变成垃圾对象,等待垃圾收集器彻底从内存中清除。
反之,如果浏览器超时后,再次向服务器发出请求访问,那么,Web服务器则会创建一个新的HttpSession对象,并为其分配一个新的ID属性。

设置:会话过程中,会话的有效时间可以在web.xml文件中配置,默认值由servlet容器定义。在tomcat安装目前/conf/web.xml :

  1. <session-config>
  2. <session-timeout>30</session-timeout>
  3. <session-config>

单位:分钟
① 如果将元素中的时间值设置成0 或一个负数,则表示会话永不超时。
② 如果想单独设置某个web应用程序的会话超时间,则需要在自己应用的web.xml文件中进行设置。
③ 注意:要想使session失效,除了可以等待会话时间超时外,还可以通过invalidate()方法强制使会话失效。

4、URL重写实现Session跟踪

4.1、 考虑到浏览器可能不支持cookie的情况,servlet规范中引入了URL重写机制来保存用户的会话信息。
4.2、所谓URL重写,指的是将session的会话标识号以参数的形式附加在超链接的URL地址后面。
4.3、 对于tomcat服务器来说,就是将JSESSIONID关键字作为参数名以及会话标识好的值作为参数值附加到URL地址后面。
4.4、当浏览器不支持cookie或者关闭了cookie功能时,在会话过程中,如果想让web服务器可以保存用户的信息,必须对所以可能被客户端访问的请求路径进行URL重写。
在HttpServletResponses接口中,定义了两个用于完成URL重写的方法,具体如下:
① encodeURL(String url):用于对超链接和Form表单的action属性中设置的URL进行重写。
②encodeRedirectURL(String url):用于对要传递给HttpServletResponse.sendRedirect方法的URL进行重写。

注意:在URL重写时,前面要通过getSession()方法获取session对象。