欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java笔记 - Cookie & Session

程序员文章站 2022-03-11 16:36:37
...

会话技术

会话:在客户端和浏览器之间,一次会话中包含多次请求和响应

一次会话

浏览器访问服务器,给服务器资源发送请求,建立会话,直到有一方断开为止

功能

在一次会话内,多次请求间的范围内共享数据

方式

  1. 客户端会话技术 Cookie
  2. 服务器会话技术 Session

Cookie

概念:客户端会话技术,将数据保存到客户端

步骤

  1. 创建Cookie对象,绑定数据
  2. 发送Cookie对象 Demo1设置了一个响应头Set-Cookie: msg=hello! 保存到客户端浏览器中
  3. 获取Cookie,拿到数据 Demo2有了一个请求头Cookie: msg=hello!

案例1

Demo1发送Cookie ,Demo2 接收Cookie

@WebServlet("/CookieDemo01")
public class CookieDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie
        Cookie cookie = new Cookie("msg","hello!");
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
@WebServlet("/CookieDemo02")
public class CookieDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name + ":" + value);
            }
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

细节

  1. 一次可以发送几个Cookie?

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //尝试创建多个Cookie
        Cookie c1 = new Cookie("msg", "hello");
        Cookie c2 = new Cookie("name", "tung");
        //使用响应头来设置
        response.addCookie(c1);
        response.addCookie(c2);
    }
    
  2. Cookie能否存中文?

    Tomcat8之后支持中文,我装的是9,为什么不行❓

  3. Cookie在浏览器中保存多久?

    默认:浏览器关闭后自动清除Cookie

    持久化:setMaxAge(int seconds) seconds表示存活时间

    • 正数:持久化存储,写到硬盘的文件中
    • 负数:默认值 (可省略)
    • 0:删除Cookie信息
  4. Cookie 的范围多大?

    默认情况下不能共享

    设置Cookie范围:setPath(String path),把虚拟路径设置成大一级

    如果要在不同的Tomcat服务器之间共享Cookie?

    setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享

  5. 特点

    1. 浏览器对单个cookie存储有限制(4kb),对同一个域名下的总cookie数量也有限制(20个)
    2. cookie一般存储不太敏感的数据
    3. 作用:在不登录的情况下,完成服务器对客户的身份识别

Session

概念

客户端会话技术,将数据保存到服务器中。 HttpSession

存储一次会话多次请求的数据

举个例子,在未登录淘宝账号的情况下把商品添加到购物车里,关闭浏览器,再次打开仍旧在,其实就是调用了Session

HttpSession 对象的方法

  1. getAttribute
  2. setAttribute
  3. removeAttribute
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取对象
    HttpSession session = request.getSession();
    //使用对象
    Object msg = session.getAttribute("msg");
    System.out.println(msg);
}

原理

Session是依赖于Cookie的,通过请求/响应头中的 JSESSIONID 来确定是同一个Session

细节

  1. 客户端关闭后,服务器未关闭,两次Session是否为同一个?

    默认情况下不是同一个

    可以通过Cookie来缓存JSESSIONID

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        System.out.println(session);
    
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
    }
    
  2. 客户端不关闭后,服务器关闭,两次Session是否为同一个?

    不是同一个

  3. Session 的生存时间?

    Session 被销毁的情况

    1. 服务器被关闭
    2. Session调用自杀方法 invalidate()
    3. 默认失效时间 30 分钟 (可以改)
Cookie - 小饼干 Session - 主菜
存储数据的大小有限制,只能存储 String 类型的对象 可以存储任意大小的数据,可以存任意类型
保存在客户端 保存在服务器
不安全 安全
客户端可以禁用Cookie 无法被禁用
相关标签: Java