一、会话概述
二、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 :
<session-config>
<session-timeout>30</session-timeout>
<session-config>
单位:分钟
① 如果将
② 如果想单独设置某个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对象。