一篇文章搞懂Cookie

「爱情、让人受尽委屈。」 2024-03-27 15:52 162阅读 0赞

目录

1 什么是Cookie

2 创建Cookie

3 浏览器查看Cookie

3.1 浏览器查看Cookie的第一种方式

3.2 浏览器查看Cookie的第二种方式

4 获取Cookie

5 修改Cookie

6 Cookie编码与解码

6.1 创建带中文Cookie

6.2 读取带中文Cookie

6.3 获取中文Cookie请求效果

6.4 解决创建和获取中文Cookie

7 Cookie优点和缺点

7.1 Cookie优点

7.2 Cookie缺点


Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。

一个Cookie主要有标识该信息的名称(name)和值(value)组成。

5ce31b7c0a8249308552075245f968c6.png

  1. //设置Cookie
  2. Cookie cookie = new Cookie("username", "zhangsan");
  3. /*
  4. *设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
  5. * 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
  6. * 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
  7. * 零:删除对应Cookie
  8. */
  9. cookie.setMaxAge(60);
  10. //设置Cookie的访问路径
  11. cookie.setPath("/webProject05_war_exploded/GetCookieValueServlet01");
  12. //发送Cookie到客户端
  13. response.addCookie(cookie);

1d43c3579bff45bf8370f743ea99a487.png

c9faaf8e73c144a09eb36cf039413632.png

  1. //获取所有Cookie
  2. Cookie[] cookies = request.getCookies();
  3. //遍历数组,获取所有的Cookie
  4. for (Cookie cookie : cookies) {
  5. System.out.println(cookie.getName() + "-" + cookie.getValue());
  6. }
  7. System.out.println("----------------------------------------");
  8. //遍历数组,获取指定的Cookie
  9. for (Cookie cookie : cookies) {
  10. if (cookie.getName().equals("username")) {
  11. System.out.println(cookie.getName() + "-" + cookie.getValue());
  12. }
  13. }

只需要保证Cookie的名称和路径一致即可修改

注意:如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie

  1. //设置Cookie,如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie
  2. Cookie cookie = new Cookie("username", "lisi");
  3. /*
  4. *设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
  5. * 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
  6. * 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
  7. * 零:删除对应Cookie
  8. */
  9. cookie.setMaxAge(30);
  10. //设置Cookie的访问路径
  11. cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet01");
  12. //发送Cookie到客户端
  13. response.addCookie(cookie);

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

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
  • 解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法
  1. package com.cxyzxc.www.servlet01;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet(name = "CookieServlet03", value = "/CookieServlet03")
  10. public class CookieServlet03 extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //设置请求参数的编码格式,这种方式对get请求方式无效
  14. request.setCharacterEncoding("UTF-8");
  15. //设置响应编码格式为UTF-8
  16. response.setContentType("text/html;charset=UTF-8");
  17. //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
  18. Cookie cookie = new Cookie("姓名", "张三");
  19. //设置Cookie的访问路径
  20. cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet03");
  21. //发送Cookie到客户端
  22. response.addCookie(cookie);
  23. }
  24. @Override
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. doGet(request, response);
  27. }
  28. }
  1. package com.cxyzxc.www.servlet01;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet(name = "GetCookieValueServlet03", value = "/GetCookieValueServlet03")
  10. public class GetCookieValueServlet03 extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //设置请求参数的编码格式,这种方式对get请求方式无效
  14. request.setCharacterEncoding("UTF-8");
  15. //设置响应编码格式为UTF-8
  16. response.setContentType("text/html;charset=UTF-8");
  17. //获取所有Cookie
  18. Cookie[] cookies = request.getCookies();
  19. //遍历数组,获取所有的Cookie
  20. for (Cookie cookie : cookies) {
  21. System.out.println(cookie.getName() + "-" + cookie.getValue());
  22. }
  23. System.out.println("----------------------------------------");
  24. //遍历数组,获取指定的Cookie
  25. for (Cookie cookie : cookies) {
  26. if (cookie.getName().equals("姓名")) {
  27. System.out.println(cookie.getName() + "-" + cookie.getValue());
  28. }
  29. }
  30. }
  31. @Override
  32. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  33. doGet(request, response);
  34. }
  35. }

ac04b7a4806c4acf83d9800b6d565a3d.png

d0ad6abb8c8b4db6b281c9e261b5838a.png

6.4.1 创建中文Cookie

  1. package com.cxyzxc.www.servlet01;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.net.URLEncoder;
  10. @WebServlet(name = "CookieServlet04", value = "/CookieServlet04")
  11. public class CookieServlet04 extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. //设置请求参数的编码格式,这种方式对get请求方式无效
  15. request.setCharacterEncoding("UTF-8");
  16. //设置响应编码格式为UTF-8
  17. response.setContentType("text/html;charset=UTF-8");
  18. //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
  19. Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));
  20. //设置Cookie的访问路径
  21. cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet04");
  22. //发送Cookie到客户端
  23. response.addCookie(cookie);
  24. }
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. }

6.4.2 获取中文Cookie

  1. package com.cxyzxc.www.servlet01;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.net.URLDecoder;
  10. @WebServlet(name = "GetCookieValueServlet04", value = "/GetCookieValueServlet04")
  11. public class GetCookieValueServlet04 extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. //设置请求参数的编码格式,这种方式对get请求方式无效
  15. request.setCharacterEncoding("UTF-8");
  16. //设置响应编码格式为UTF-8
  17. response.setContentType("text/html;charset=UTF-8");
  18. //获取所有Cookie
  19. Cookie[] cookies = request.getCookies();
  20. //遍历数组,获取指定的Cookie
  21. for (Cookie cookie : cookies) {
  22. if (URLDecoder.decode(cookie.getName(),"UTF-8").equals("姓名")) {
  23. System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + "-" + URLDecoder.decode(cookie.getValue(),"UTF-8"));
  24. }
  25. }
  26. }
  27. @Override
  28. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  29. doGet(request, response);
  30. }
  31. }

6.4.3 获取中文Cookie请求效果

3493880eb78c4966814037731b1cedbb.png

91c03be4f8e649309b769897c3eba0c6.png

  • 可配置到期规则
  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对
  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的
  • 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制
  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收Cookie的能力,因此限制了这一功能
  • 潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读

    相关 文章MVCC

    事务 什么是事务?当事务对数据库进行多个更改时,要么在事务提交时所有更改都成功,要么在事务回滚时所有更改都被撤销。 在 MySQL 中,事务支持是在引擎层实现的。MySQ

    相关 文章JVM

    (一)jvm基础知识 (1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不