1. Cookie原理解析

1.1 基本概念

  • Cookie本意为”饼干“的含义,在这里表示客户端以“名-值”形式进行保存的一种技术。
  1. 浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器
  2. 然后浏览器会将这些数据以文本文件的方式保存起来。
  3. 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器

1.2 常用方法

  • 使用javax.servlet.http.Cookie类的构造方法实现Cookie的创建。
  • Cookie(String name, String value) 根据参数指定数值构造对象
  • 使用javax.servlet.http.HttpServletResponse接口的成员方法实现Cookie的添加。
  • void addCookie(Cookie cookie) 添加参数指定的对象到响应
  • 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Cookie对象的获取
  • Cookie[] getCookies() 返回此请求中包含的所有Cookie对象
  • 使用javax.servlet.http.Cookie类的构造方法实现Cookie对象中属性的获取和修改
  • String getName() 返回此 Cookie 对象中的名字
  • String getValue() 返回此 Cookie 对象的数值
  • void setValue(String newValue) 设置 Cookie 的数值

1.3 代码案例

  • CookieServlet
package cn.knightzz.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 王天赐
 * @title: CookieServlet
 * @projectName spring-aop-01
 * @description:
 * @website http://knightzz.cn/
 * @github https://github.com/knightzz1998
 * @date 2022/1/9 18:58
 */
@WebServlet(name = "CookieServlet", urlPatterns = "/cookie-servlet")
public class CookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 创建Cookie信息
        Cookie cookie = new Cookie("name", "Tom");
        // 2. 获取Cookie的默认使用期限 单位是 秒
        int maxAge = cookie.getMaxAge();
        System.out.println("maxAge = " + maxAge);
        // 3. 修改Cookie的默认使用期限
        cookie.setMaxAge(36000);
        // 4. 将Cookie添加到响应信息中
        resp.addCookie(cookie);

        // 重定向到 success.html 页面
        resp.sendRedirect("success.html");
    }
}
  • index.jsp
<html>
<head>
	<meta charset="UTF-8">
	<title>Index</title>
</head>
<body>
<h2>Hello World!</h2>

<a href="thread.html">Servlet Thread</a> |
<a href="cookie-servlet">Cookie</a>

</body>
</html>
  • 访问 index.jsp 页面 点击 Cookie , 如下图所示, 在响应头和请求头携带相应的cookie

1.4 Cookie周期

  • 默认情况下,浏览器会将Cookie信息保存在内存中,只要浏览器关闭,Cookie信息就会消失。
  • int getMaxAge() 返回cookie的最长使用期限(以秒为单位)
    void setMaxAge(int expiry) 设置cookie的最长保留时间(秒)
  • 如果希望关闭浏览器后Cookie信息仍有效,可以通过Cookie类的成员方法实现。
// 1. 创建Cookie信息
        Cookie cookie = new Cookie("name", "Tom");
        // 2. 获取Cookie的默认使用期限 单位是 秒
        int maxAge = cookie.getMaxAge();
        System.out.println("maxAge = " + maxAge);
        // 3. 修改Cookie的默认使用期限
        cookie.setMaxAge(36000);
        // 4. 将Cookie添加到响应信息中
        resp.addCookie(cookie);

1.5 Cookie原理

java cookie 没有samesite_Cookie

1.6 Cookie的路径问题

  • 浏览器在访问服务器时,会比较 Cookie 的路径与请求路径是否匹配,只有匹配的 Cookie 才会发送
    给服务器。
  • Cookie 的默认路径等于添加这个 Cookie 信息时的组件路径,例如:/web-servlet-03 请求添加
    了一个 Cookie 信息,则该 Cookie 的路径是 /web-servlet-03
  • void setPath(String uri) 设置 cookie 的路径信息
  • 访问的请求地址必须符合 Cookie 的路径或者其子路径时,浏览器才会发送 Cookie 信息

1.7 Cookie的特点

  • Cookie技术不适合存储所有数据,只用于存储少量、非敏感信息,原因如下:
  • 将状态数据保存在浏览器端,不安全。
  • 保存数据量有限制,大约4KB左右。
  • 只能保存字符串信息。
  • 可以通过浏览器设置为禁止使用

2. Session概念与原理

2.1 基本概念

  • Session本意为"会话"的含义,是用来维护一个客户端和服务器关联的一种技术。
  • 浏览器访问服务器时,服务器会为每一个浏览器都在服务器端的内存中分配一个空间,用于创建一
    个Session对象,该对象有一个id属性且该值唯一,我们称为SessionId,并且服务器会将这个SessionId以Cookie方式发送给浏览器存储。
  • 浏览器再次访问服务器时会将SessionId发送给服务器,服务器可以依据SessionId查找相对应的
    Session对象

2.2 相关方法

  • 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Session的获取。
  • HttpSession getSession() 返回此请求关联的当前Session,若此请求没有则创建一个
  • 使用javax.servlet.http.HttpSession接口的成员方法实现判断和获取
  • boolean isNew() 判断是否为新创建的Session
  • String getId() 获取Session的编号,唯一的属性值 sessionId
  • 使用javax.servlet.http.HttpSession接口的成员方法实现属性的管理。
  • Object getAttribute(String name) 返回在此会话中用指定名称绑定的对象,如果没有对象在
    该名称下绑定,则返回空值
  • void setAttribute(String name, Object value) 使用指定的名称将对象绑定到此会话
  • void removeAttribute(String name) 从此会话中删除与指定名称绑定的对象

2.3 代码案例

  • SessionServlet
package cn.knightzz.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author 王天赐
 * @title: SessionServlet
 * @projectName spring-aop-01
 * @description:
 * @website http://knightzz.cn/
 * @github https://github.com/knightzz1998
 * @date 2022/1/10 21:36
 */
@WebServlet(name = "SessionServlet", urlPatterns = "/session-servlet")
public class SessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取session
        HttpSession session = req.getSession();
        System.out.println("session.isNew() = " + session.isNew());
        System.out.println("session.getId() = " + session.getId());

        // 2. 设置session属性
        session.setAttribute("session-name", "Session");

        String attribute = (String) session.getAttribute("session-name");
        System.out.println("attribute = " + attribute);
        // 3. 设置生命周期
        int maxInactiveInterval = session.getMaxInactiveInterval();
        System.out.println("maxInactiveInterval = " + maxInactiveInterval);
        // 设置失效时间, Session对象一般是默认30分钟失效
        session.setMaxInactiveInterval(3600);
    }
}

2.4 Session生命周期

  • 为了节省服务器内存空间资源,服务器会将空闲时间过长的Session对象自动清除掉,服务器默认
    的超时限制一般是30分钟。
  • 使用javax.servlet.http.HttpSession接口的成员方法实现失效实现的获取和设置
  • 常用方法
  • int getMaxInactiveInterval() 获取失效时间
  • void setMaxInactiveInterval(int interval) 设置失效时间
  • 可以配置web.xml文件修改失效时间。
<session-config> 
    <session-timeout>30</session-timeout> 
</session-config>

2.5 Session原理

java cookie 没有samesite_服务器_02

  • 注意 : SessionId 是 服务器和浏览器之间建立的, 而不是 Servlet对象和浏览器, 所以多个Servlet仅有一个Session对象

2.6 Session特点

  • 数据比较安全。
  • 能够保存的数据类型丰富,而Cookie只能保存字符串。Session的 Value 可以存储 Object
  • 能够保存更多的数据,而Cookie大约保存4KB。
  • 数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务
    器的性能。