Cookie & Session

Cookie & Session

Cookie

Cookie(小甜饼)是客户端技术,服务器把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样,web 资源处理的就是用户各自的数据了。

Cookie 信息就像是小甜饼(cookie 中文)一样,数据量并不大,服务器端在需要的时候可以从客户端/浏览器读取。

请添加图片描述

快速入门

设置cookie:

// 创建Cookie对象
Cookie cookie = new Cookie("key1", "value1");
Cookie cookie1 = new Cookie("key2", "value2");
// 给响应结果设置cookie
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1>hi, 创建 Cookie 成功</h1>");

获取cookie:

// 从请求中获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + " = " + cookie.getValue());
}

请添加图片描述

可以看到浏览器在请求头中携带了cookie信息,除了我们自己设置的,还多了个JESSIONID。

JESSIONID

jsessionid是Java Servlet规范中定义的一种用于在浏览器端存储会话标识的方式。当用户第一次访问一个使用Servlet开发的网站时,服务器会在响应头中返回一个名为"Set-Cookie"的字段,其中包含了一个名为"JSESSIONID"的cookie,其值是一个唯一的。

jsessionid的作用是用于在用户与服务器之间建立会话,以便在用户的访问过程中保持会话状态。当用户在浏览器中启用cookie时,浏览器会自动将这个名为"JSESSIONID"的cookie保存下来,并在后续的请求中自动发送给服务器,以便服务器能够识别用户并维护他们的会话状态。

通过jsessionid,服务器可以识别用户的会话并在会话期间跟踪用户的状态,例如保存用户的登录信息、购物车内容等。同时,jsessionid也可以防止跨站点请求伪造(CSRF)攻击,因为只有拥有正确的jsessionid的请求才会被服务器接受。

cookie 生命周期

Cookie 的生命周期指的是如何管理 Cookie 什么时候被销毁(删除)。

使用setMaxAge() 方法可以给cookie指定有效时间。

  • 正数,表示在指定的秒数后过期
  • 负数,表示浏览器关闭,Cookie 就会被删除(默认值是-1)
  • 0,表示马上删除 Cookie
Cookie cookie = new Cookie("name", "xlg");
// 设置有效时间为60秒
cookie.setMaxAge(60);
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1>hi, 创建 Cookie 成功</h1>");

可以通过cookie.setMaxAge(0);来销毁cookie,但记得要添加到response中

Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
    if("name".equals(cookie.getName())){
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }
}
}

cookie 有效路径

Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。 path属性是通过请求的地址来进行有效的过滤。

规则如下:

cookie1.setPath = /工程路径
cookie2.setPath = /工程路径/aaa

请求地址: http://ip:端口/工程路径/资源
cookie1 会发给服务器
cookie2 不会发给服务器

请求地址: http://ip:端口/工程路径/aaa/资源
cookie1 会发给服务器
cookie2 会发给服务器

只要请求路径中包含了cookie设置的路径,浏览器就会携带该cookie。

注意事项

1)一个 Cookie 只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

2)一个 WEB 站点可以给一个浏览器发送多个 Cookie,一个浏览器也可以存储多个 WEB 站点提供的 Cookie。

3)cookie 的总数量没有限制,但是每个域名的 COOKIE 数量和每个 COOKIE 的大小是有限制的 (不同的浏览器限制不同) , Cookie 不适合存放数据量大的信息。

4)删除 cookie 时,path 必须一致,否则不会删除。

5) cookie 存放中文会出现乱码问题,可以通过URL编码和解码来解决。

// 编码
String encode = URLEncoder.encode("你好");
System.out.println(encode);
// 解码
String decode = URLDecoder.decode(encode);
System.out.println(decode);

Session

Session 是服务器端技术,服务器在运行时为每一个用户的浏览器创建一个其独享的session 对象/集合。

由于 session 为各个用户浏览器独享,所以用户在访问服务器的不同页面时,可以从各自的 session 中读取/添加数据,从而完成相应任务。

可以把 session 看作是一容器类似 HashMap,有两列(K-V),每一行就是 session 的一个属性。每个属性包含有两个部分,一个是该属性的名字(String),另外一个是它的值(Object)。

请添加图片描述

常用方法

1)获取当前会话的HttpSession对象:

HttpSession session = request.getSession();
java复制代码

2)设置会话属性:

session.setAttribute("key", "value");
java复制代码

3)获取会话属性:

String value = (String) session.getAttribute("key");
java复制代码

4)设置会话超时时间(单位为秒):

session.setMaxInactiveInterval(60); // 设置会话超时时间为60秒
java复制代码

5)使会话无效:

session.invalidate();

原理图

请添加图片描述

请添加图片描述

代码演示

设置session:

req.getSession().setAttribute("name","123");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<h1>hi, 创建 Session 成功</h1>");

请添加图片描述

可以看到服务端发出的响应中携带了JESSIONID,作为会话标识符。

获取session:

HttpSession session = req.getSession();
System.out.println(session.getAttribute("name"));

在获取session时服务器会通过浏览器发来的jessionid来寻找与之对应的session对象。

session 生命周期

1)public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。

2)值为正数的时候,设定 Session 的超时时长。

3)负数表示永不超时

4)public int getMaxInactiveInterval()获取 Session 的超时时间

5)public void invalidate() 让当前 Session 会话立即无效

6)如果没有调用 setMaxInactiveInterval() 来指定 Session 的生命时长,Tomcat 会以 Session默认时长为准,Session 默认的超时为 30 分钟, 可以在 tomcat 的 web.xml 设置

7)Session 的生命周期指的是 :客户端/浏览器两次请求最大间隔时长,而不是累积时长。即当客户端访问了自己的 session,session 的生命周期将从 0 开始重新计算。

8)底层: Tomcat 用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁

相关推荐

  1. http请求处理相关注解、cookiesession

    2024-04-02 23:02:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 23:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 23:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 23:02:02       82 阅读
  4. Python语言-面向对象

    2024-04-02 23:02:02       91 阅读

热门阅读

  1. 系统学习Docker:1_Docker简介以及2_安装Docker

    2024-04-02 23:02:02       43 阅读
  2. vi/vim编辑器

    2024-04-02 23:02:02       39 阅读
  3. 开源中文大语言模型汇总

    2024-04-02 23:02:02       37 阅读
  4. pip/conda导出或导入环境

    2024-04-02 23:02:02       65 阅读
  5. 迪米特法则

    2024-04-02 23:02:02       37 阅读
  6. 10个大幅提升MySQL效率的使用技巧

    2024-04-02 23:02:02       36 阅读