会话和会话状态
一、会话概述
1)现象:HTTP协议是一种无状态的协议,Web服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。
2)解决:借助会话状态,Web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。
3)实现:需要浏览器对其发出的每个请求消息都进行标识。这个标识称为会话ID(SessionID)。
二、Cookie
1. 概述
1)机制:采用在客户端保持HTTP状态的方案。浏览器访问服务器时,由服务器在HTTP响应消息头中附带一个传送给浏览器的小文本文件。之后浏览器每次访问服务器时,都会在HTTP请求头中将这个 Cookie 回传给服务器。
2)原理:服务器通过在HTTP响应消息中增加 Set-Cookie 响应头字段将 Cookie 信息发送给浏览器,浏览器则通过在HTTP请求消息中增加 Cookie 请求头字段将 Cookie 回传给服务器。
2. 创建Cookie
方法签名:
- Cookie(String name, String value) //构造器
- void setMaxAge(int maxAge) //设置 Cookie 的最大时效, 以秒为单位。
若为 0 , 表示立即删除该 Cookie;
若为负数, 表示不存储该 Cookie;
若为正数, 表示该 Cookie 的存储时间。
- void addCookie(Cookie cookie) //把Cookie加入到响应中
//1. 创建一个 Cookie 对象 Cookie cookie = new Cookie("name", "atguigu");
//2. 设置 Cookie 的最大时效 cookie.setMaxAge(30); //3. 调用 response 的一个方法把 Cookie 传给客户端. response.addCookie(cookie);
3. 获取Cookie
方法签名:
- Cookie[] getCookies() //获得这次请求中的全部Cookie
- String getName() //获得当前Cookie的名字
- String getValue //获得当前Cookie的值
//1. 获取 Cookie Cookie [] cookies = request.getCookies(); if(cookies != null && cookies.length > 0){ for(Cookie cookie: cookies){ //2. 获取 Cookie 的 name 和 value out.print(cookie.getName() + ": " + cookie.getValue()); } }
4. Cookie的作用范围
1)默认范围:可以作用当前目录和当前目录的子目录. 但不能作用于当前目录的上一级目录。
2)解决方案:可以通过 setPath 方法来设置 Cookie 的作用范围, 其中 / 代表站点的根目录。
Cookie cookie = new Cookie("cookiePath", "CookiePathValue"); //设置 Cookie 的作用范围: cookie.setPath(request.getContextPath()); response.addCookie(cookie);
三、HttpSession
1. 概念
1)含义:在Web开发环境中,session 是指一类用来在客户端与服务器之间保持状态的解决方案。有时候也用来指这种解决方案的存储结构。
2)机制:采用在服务器端保持HTTP状态信息。
3)原理:
- 创建一个 session 时先检查这个客户端的请求里是否包含了一个 session 标识(即sessionID),即请求里是否存放了名为"JESESSIONID",值为 sessionID 的 cookie。
- 若已存在就检索出来使用,
- 否则为此客户创建一个 session,并生成一个与此 session 相关联的 sessionID,用 set-cookie 方式传递给请求,那么下一次请求发出时,就会使用此 sessionID 作为 cookie 中名为"JESESSIONID"的值进行传递 sessionID。
4)保存方式:最常用的是用 cookie 保存。但如果 cokkie 被禁用,必须有其他机制进行保存。如URL重写:把 sessionID 附加在URL路径后面。
5)注意:由于是通常是用 cookie 来保存的,所以如果让 cookie 持久化就可以在重启浏览器后也能获取到该 sessionID。
//用持久化cookie保存sessionID Cookie cookie = new Cookie("JESESSIONID",session.getId()); cookie.setMaxAge(20); response.addCookie(cookie);
2. Session的创建
1) Session 属性:
- 若 page 指定的 Session 属性默认为 true,那么 第一次访问一个 WEB 应用的一个 JSP 页面时,该页面都必须有一个和这个请求相关联的 Session 对象。
- 否则JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以第一次访问JSP页面时不会创建一个 Session。
2)request.getSession(boolean flag):
- true,则一定会返回一个 HttpSession 对象,如果已经有和当前 JSP 页面关联的 HttpSession对象,直接返回;如果没有,则创建一个新的返回。
- false,则若没有和当前JSP页面关联的 HttpSession 对象返回null,否则返回取得的HttpSession对象。
- request.getSession() 相当于 request.getSession(true)。
3. Session对象的销毁
1)调用HttpSession 的 invalidate()方法。
2)HttpSession 超过过期时间自动销毁,可以在 Tomcat 的 web.xml 文件中配置 Session 的最大时效, 单位是分钟。
<!-- apache-tomcat-x.x.xx\conf\web.xml --> <session-config> <session-timeout>30</session-timeout> </session-config>
相关方法签名:
- int getMaxInactiveInterval() //返回最大时效,单位:秒
- void setMaxInactiveInterval(int interval) //设置最大时效
3)服务器卸载当前 WEB 应用。
4.Session相关方法
String getId() //得到sessionID
boolean isNew() //该session是不是新创建的
long getCreationTime() //该session被创建的时间
long getLastAccessedTime() //该session最后一次被访问的时间
void setAttribute(String key, Object value) //存放值,相当于哈希表
Object getAttrbute(String key) //根据键从session中取得对应的值
5.URL重写实现Session跟踪
方法签名:String encodeURL(String url) //该方法会在URL后面加上sessionID
<!-- JSP中 -->
<a href="<%= response.encodeURL("login.jsp") %>">重新登录</a>
<!-- 网页源文件 -->
<a href="login.jsp:jsessionid=5D47F6A9A12A34CC4383E23D927982CF">重新登录</a>