从零开始学习JavaWeb - Cookie和Session原理解析

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

    image-20220110204731408

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原理

image-20220110210646039

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原理

image-20220111092516820

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

2.6 Session特点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兀坐晴窗独饮茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值