JavaWEB-(二十四)Cookie

本文最后更新于:May 13, 2023 pm

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入JSESSIONID用于标记一个会话(session),这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。Cookie是客户端技术,而HttpSession是服务器端技术。Cookie是客户端技术,通常保存在客户端,即本地,IE浏览器把Cookie信息保存在类似于C:\windows\cookies的目录下。因为Cookie在客户端所以可以编辑伪造,不是十分安全

目录

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

1.Cookie的查看

1.1 方法一

打开网页 -> 审查元素 -> 在网络(Network)-> 刷新页面 -> 标头(Headers)-> 响应标头(Response Headers)-> Set-Cookie 。

1.2 方法二

打开网页中的设置,找到Cookie,输入localhost ,再找到对应自己新建的Cookie。

2.Cookie的创建

一个Cookie主要由标识该信息的名称和值组成(键值对)。

1
2
Cookie cookie = new Cookie("username","loong");
resp.addCookie(cookie);

2.1 设置Cookie路径

setPath(“/webs”); webs是项目名称。 默认情况下是该项目下所有资源都可以访问。

1
2
3
Cookie cookie = new Cookie("username","loong");
cookie.setPath("/Cook_war_exploded/helloservlet");
resp.addCookie(cookie);

设置了路径 /Cook_war_exploded/helloservlet ,表明只有 helloservlet 或者 helloservlet 目录 下的资源才可以访问 Cookie。

查看此Cookie 可以发现多了一个 Path。

2.2 设置Cookie生命周期

setMaxAge(-1); 内存存储。有三种值:大于0(>0)表示有效期,单位是秒;等于0(=0)表示浏览器关闭就失效;小于0(<0)内存存储,临时存储,为默认情况。

1
2
3
4
Cookie cookie = new Cookie("username","loong");
cookie.setPath("/Cook_war_exploded/hello-servlet");
cookie.setMaxAge(60); //秒
resp.addCookie(cookie);

在审查元素时看到的时间是有时区的!!!所以需要到设置中去查看。

3.获取Cookie

request.getCookies(); 返回的是一个Cookie类型的数组。获取的是多个的Cookie。

1
2
3
4
5
6
Cookie[] cookies = req.getCookies();
if(cookies != null){
for(Cookie it : cookies){
System.out.println(it.getName() + " : " + it.getValue());
}
}

if 用来判断是否拿到了Cookie。
⚠️注意:如果某一个Cookie A 设置了访问路径,并且获取Cookie的类B 不在路径内,则B不会获取到A!!!

4.修改Cookie

只需要保存新创建的一个Cookie的名称和路径等,与需要修改的Cookie一致,即可覆盖(修改)。

5.Cookie编码与解码

  • Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码(错误)。

5.1 编码

使用java.net.URLEncoder 类的 encode(String str,String encoding) 方法。

使用:

1
URLEncoder.encode("姓名","UTF-8")

注意:这里只是用了编码,在审查元素时或者在设置中,包括获取Cookie再进行输出时,看到的仍然不是中文。

5.2 解码

使用java.net.URLDecoder 类的 decode(String str,String encoding) 方法。

1
URLDecoder.decode("姓名","UTF-8")

5.3 示例

设置Cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.tothefor.cook;

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;
import java.net.URLEncoder;

@WebServlet(value = "/cook")
public class cookie extends HttpServlet {

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

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("龙龍","UTF-8"));
resp.addCookie(cookie);
}
}

获取Cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.tothefor.cook;

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;
import java.net.URLDecoder;

@WebServlet(value = "/get")
public class getC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if(cookies != null){
for(Cookie it : cookies){
System.out.println(URLDecoder.decode(it.getName(),"UTF-8") + " : " + URLDecoder.decode(it.getValue(),"UTF-8"));
}
}
}
}

这样,在控制台上就可以看见Cookie就是中文的。

6.Cookie特点

6.1 优点

  1. 可配置到期时间。
  1. 简单性。Cookie是一种基于文本的轻量结构,包含简单的键值对。
  1. 数据持久化。Cookie默认在过期之前是可以一直存在客户端浏览器上的。

6.2 缺点

  1. 大小限制。大多数浏览器对Cookie的大小有4K、8K的限制。
  1. 用户禁用。用户可禁用浏览器或客户端接受Cookie的能力。
  1. 安全问题。Cookie可能会被篡改。

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/2319139757.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!