会话和会话状态

一、会话概述

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.xxconfweb.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>
原文地址:https://www.cnblogs.com/CComma/p/7173167.html