会话的概念和作用
- 会话: 对于 Web 应用来说,会话就是浏览器与服务器之间的一次连续的通讯过程.
- HTTP 协议是无状态的,也就是说,一次请求结束后,HTTP 协议就不再记录相关信息;
- 而实际应用中,却常常需要记住一些状态信息;
- ==会话跟踪==技术就是能够跟踪客户端和服务端的交互,保存和记忆相关信息,保存请求的状态信息.
常用的四种会话跟踪技术
- URL 方式:需要保存的信息直接追加到 URL 后,例如:
http://127.0.0.1:8080/chapter03/viewList?pageNo=12
- 隐藏域方式:可以使用表单中的隐藏域保存相关信息, 例如:
<input type="hidden" name=“status" value=“true">
- Cookie 方式:将状态信息保存到客户端,服务器能够获得相关信息进行分析,从而生成对客户端的响应;例如简化登录功能就可以使用 Cookie 实现;
- Session 方式:将状态信息保存到服务器的会话对象中,通过唯一标记的 ID 值与客户端进行绑定使用;例如访问控制功能就可以使用 Session 实现;
Cookie 的功能和特点
- Cookie 是一段保存在客户端的小文本;能够用来将用户活动过程中的状态信息保存到客户端,服务器可以获得该信息以便进行处理,跟踪到用户的状态;
- Cookie 包含一系列属性:如:
- name:cookie 的名字,每个 cookie 都有一个名字; + content:cookie 的值,与名字一起作为键值对形式存在; + domain:域,该 cookie 的域名,例如 csdn.net,说明当前 cookie 来自 csdn.net; + path:路径,访问 csdn.net 下该路径时,当前 cookie 将被发送; + created:cookie 被创建的时间; + Expired:cookie 失效的时间; + 最大生命时间:失效时间和创建时间的时间差,就是 cookie 的最大生命时间,超过该时间,cookie 将失效,不再被发送到相应的域地址;
创建 cookie,设置 cookie 属性
Servlet 规范中定了 Cookie 类,创建该类对象就可以创建 Cookie,并可以调用其中方法为 Cookie 设置属性;
方法声明 | 方法描述 |
---|---|
Cookie(java.lang.String name, java.lang.String value) | 创建 Cookie 对象,指定名字和对应的值; |
void setMaxAge(int expiry) | 设置最大生命时间(秒),如果不设置,当前浏览器关闭,cookie 即失效; |
void setValue(java.lang.String newValue) | 设置 Cookie 的值; |
setDomain(java.lang.String domain) | 设置 cookie 的域名; |
cookie 创建好后并不能存储到客户端,要将 cookie 保存到客户端,必须添加到响应对象中,响应接口中定义了 Cookie 的方法:
|方法声明|方法描述|
|:—:|:—:|
|void addCookie(Cookie cookie)|将 Cookie 对象保存到相应的响应对象中;|
当访问相同域名及路径时,没有超过有效时间的 cookie 将自动通关请求发送到网站;
Servlet 在请求接口中定义了获取 cookie 的方法:
|方法声明|方法描述|
|:—:|:—:|
|Cookie[] getCookies()|获取请求中的所有 Cookie 对象,返回数组;|
Session 简介
- Session 是会话跟踪的另一种实现手段;
- Session 是存储在服务器上的对象,该对象由服务器创建并维护;
- 服务器为客户端与服务器的每一次会话过程都创建并维护一个 Session 对象;每个服务器对 Session 的创建和维护的底层实现有所区别;
session 创建的时间
一个常见的误解是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序调用 HttpServletRequest.getSession(true)
这样的语句时才被创建,注意如果 JSP 没有显示的使用 <% @page session=”false”%>
关闭 session,则 JSP 文件在编译成 Servlet 时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);
这也是 JSP 中隐含的 session 对象的来历。
由于 session 会消耗内存资源,因此,如果不打算使用 session,应该在所有的 JSP 中关闭它。
session 的生命周期
Session 生成后,只要用户继续访问,服务器就会更新 Session 的最后访问时间,并维护该 Session。用户每访问服务器一次,无论是否读写 Session,服务器都认为该用户的 Session“活跃(active)”了一次。
由于会有越来越多的用户访问服务器,因此 Session 也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的 Session 从内存删除。这个时间就是 Session 的超时时间。如果超过了超时时间没访问过服务器,Session 就自动失效了。