文章目录
HTTP设计成无状态的协议,但是怎么知道是哪个客户端,有时需要知道,客户端识别,Servlet 定义一个HttpSession接口
7.1、session追踪机制
7.1.1、Cookies
- 所有servlet必须要支持Cookies机制
- servlet给每个客户端发送一个cookie,标识客户,下次客户请求serlvet服务器,需要传cookie到服务器端, 标准的session名称为JSESSIONID
7.1.2、SSL Sessions
- SSL 加密Sessions
7.1.3、URL 重写
-
就是客户端没有开启cookies保存,这个时候怎么确定客户端是谁呢,只能就cookie放置到URL上,作为某一个参数,一般session名称是jsessionid
-
例子
-
http://www.myserver.com/catalog/index.html;jsessionid=1234
-
7.1.4、Session整合
- 简单来说,需要支持URL重写(将sessionId 作为url的一个参数)
7.2、创建一个session
- 什么是创建
- 客户端不知道有已经创建的session
- 客户端选择不加入这个session
- servlet开发者需要设计这个应用处理客户端没有session,客户端不支持session、将不会加入一个session的情形
- 获取sessionId ,通过javax.servlet.http.HttpSession.getId(), sessionId改变时候需要调用javax.servlet.http.HttpServletRequest.changeSessionId()
7.3、Session 作用域
- HttpSession 作用域是应用级别或servlet上下文级别,不同servlet是不允许共享HttpSession,也包含HttpSession属性
7.4、Session绑定属性
- 绑定属性变更需要实现HttpSessionBindingListener
- valueBound (绑定属性通知)
- valueUnbound(解除绑定属性通知)
7.5、Session 超时
- 怎么判断客户端不在请求呢? servlet 在HttpSession.setMaxInactiveInterval方法设置超时时间,单位为秒,如果设置为0或负数表示永久不会超时
7.6、最后服务端处理会话的时间
- HttpSession.getLastAccessedTime 最后获取会话时间
7.7、最重要Session语法
7.7.1、线程问题
- 多个servlet同时获取相同的session数据,不会有线程安全问题
7.7.2、分布式环境
- 容器必须可解析序列化(Serializable)对象
- 容器可以在HttpSession选择存储部分关键引用信息,比如事务和bean的引用
- session转移需要通知到其他servlet ( 其他servlet必须要实现HttpSessionActivationListener接口)
- 也要考虑多个JVM环境
7.7.3、客户语法
- 考虑兼容性,开发必须假定所有窗口参与同一会话情况