一、术语介绍

1.会话

        用户打开浏览器,第一次访问web服务器的资源,会话建立;直到有任一方断开连接,会话结束。一次会话中可以包含多次请求和响应
【tips】“会话”指的是浏览器和服务器之间建立会话。

2.会话跟踪

        会话跟踪是一种维护浏览器状态的方法,web服务器需要识别多次请求是否来自于同一浏览器(会话跟踪),以便在同一次会话中的多次请求间共享数据

3.为什么需要会话跟踪技术?(★)

        因为HTTP协议是无状态的,每次浏览器发送请求时,服务器都会将其视为新请求,因此需要会话跟踪技术来实现会话内数据共享

4.会话跟踪的实现方式

(1)客户端会话跟踪技术:Cookie
(2)服务器会话跟踪技术:Session
【tips】cookie和session都写在servlet中,发送和获取是写在两个servlet中。

二、Cookie

        Cookie:将数据保存到浏览器,以后的每次请求都携带Cookie数据进行访问

1.Cookie基本使用

(1)服务器向客户端发送Cookie

        1)创建Cookie对象,设置数据

Cookie cookie = new Cookie("username", "zhangsan");

        2)发送Cookie到客户端(浏览器),即将Cookie数据存到response对象

void response.addCookie(Cookie cookie);
将Cookie数据存到response对象中
response.addCookie(cookie);

(2)服务器从客户端获取Cookie

        1)使用request对象获取客户端携带的所有Cookie

Cookie[] cookies = request.getCookies();

        2)for循环遍历Cookie数组,获取每一个Cookie对象

        3)使用Cookie对象方法获取数据

for (Cookie cookie : cookies) {
    String name = cookie.getName();
    if (name.equals("username")) {
        String value = cookie.getValue();
        System.out.println(name + ":" + value);

        break;
    }
}

2.Cookie的原理

        Cookie的实现是基于HTTP协议的:务器向浏览器发送Cookie时,会在响应数据的响应头中添加一个Set-Cookie键服务器从浏览器中获取Cookie时,浏览器会在请求数据的请求头中加一个Cookie键
(1)发送Cookie:
        
(2)获取Cookie:
        

3.Cookie的生命周期

(1)默认情况下,Cookie存储在浏览器的内存中,一旦浏览器关闭,内存释放,Cookie就随之销毁了。
(2)(★)用Cookie对象的setMaxAge()设置Cookie数据的存在时间(创建后发送前设置存活时间)
public void setMaxAge(int seconds)
设置Cookie数据的存在时间。
  • second为正数:将Cookie数据写入硬盘持久化存储,到时间自动销毁;
  • second为负数:默认值,Cookie存储在浏览器内存中,随浏览器的关闭而销毁;
  • second为0:删除对应的Cookie。   

4.Cookie存储中文问题

        Cookie不能直接存储中文。那么如何实现Cookie存储中文?
                发送Cookie数据时,将中文数据进行URL编码获取Cookie时,再进行URL解码
(1)URL编码(URLEncoder.encode(String 待编码数据,StandardCharsets.UTF_8))
String name = "张三";
//URL编码
String value = URLEncoder.encode(name, StandardCharsets.UTF_8);
(2)URL解码(URLDecoder.decode(String 待解码数据,StandardCharsets.UTF_8)
String name = cookie.getName();
if (name.equals("username")) {
    String value = cookie.getValue();
    //URL解码
    value = URLDecoder.decode(value, StandardCharsets.UTF_8);
    System.out.println(name + ":" + value);
    break;
}

三、Session

        Session:将数据保存到服务器

1.Session基本使用

        JavaEE提供HttpSession接口(★),来实现一次会话的多次请求间的数据共享。
request方法 说明
HttpSession getSession();
获取Session对象
void setAttribute(String keyName,Object o) 将数据o存到Session域的keyName中
Object getAttribute(String keyName) 根据key获取值

(1)向Session中存储数据:
        1)使用request对象获取Session对象:
HttpSession session = request.getSession();
        2)向Session中添加数据:
session.setAttribute("username", "zhangsan");
(2)从Session中获取数据:
        1)使用request对象获取Session对象
HttpSession session = request.getSession();
        2)从Session中获取数据:
Object username = session.getAttribute("username");

2.Session的原理

        Session是基于Cookie实现的:当客户端访问服务器时,如果服务器启用Session,服务器就要为该客户端创建一个Session,创建时,服务器先检查这个客户端发来的请求数据里的Cookie请求头是否包含了一个Session_id,如果包含了则说明之前该客户端已经访问过服务器,那服务器根据Session_id找到对应的Session;如果不包含则为该客户端创建一个Session,并生成一个对应的Session_id,该Session_id将写在本次响应数据中的Set-Cookie响应头中,返回到客户端保存。
(1)请求数据Cookie请求头中的Session_id:
        
(2)响应数据Set-Cookie响应头中的Session_id:
        

3.Session的钝化、活化

        服务器重启后,Session中的数据仍然存在
(1)钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中。
(2)活化:再次启动服务器后,从硬盘的文件中加载数据到Session。    

4.Session的销毁

(1)自动销毁:默认情况下,无操作30分钟后Session自动销毁。可在web.xml中配置自动销毁的时间:
<session-config>
    <!--Session将在无操作100分钟后自动销毁-->
    <session-timeout>100</session-timeout>
</session-config>
(2)手动销毁:调用Session对象的invalidate()方法来销毁该Session对象。

四、Cookie和Session的比较(★)


Cookie Session
存储位置 将数据存储在客户端 将数据存储在服务器
安全性 不安全 安全
数据大小 最大3KB 无限制
存储时间 可长期存储
默认30min
服务器性能 存储在客户端,不占用服务器资源 占用服务器资源