• JavaWeb Cookie


    1. 什么是 Cookie?

            1、 Cookie 翻译过来是饼干的意思。
            2、Cookie 是服务器通知客户端保存键值对的一种技术。
            3、客户端有了 Cookie 后,每次请求都发送给服务器。
            4、每个 Cookie 的大小不能超过 4kb

    2. 如何创建 Cookie

     CookieServlet程序:

    1. @WebServlet(name = "CookieServlet", value = "/cookieServlet")
    2. public class CookieServlet extends BaseServlet {
    3. protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. // 1.创建Cookie对象
    5. Cookie cookie1 = new Cookie("key1", "value1");
    6. Cookie cookie2 = new Cookie("key2", "value2");
    7. // 2.通知客户端保存Cookie
    8. response.addCookie(cookie1);
    9. response.addCookie(cookie2);
    10. response.getWriter().write("cookie保存成功");
    11. }
    12. }

    BaseServlet 程序:

    1. @WebServlet(name = "BaseServlet", value = "/BaseServlet")
    2. public abstract class BaseServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. doPost(req, resp);
    6. }
    7. @Override
    8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. // 解决post请求中文乱码问题
    10. // 一定要在获取请求参数之前调用才有效
    11. request.setCharacterEncoding("UTF-8");
    12. response.setContentType("text/html;charset=UTF-8");
    13. String action = request.getParameter("action");
    14. // 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象
    15. try {
    16. Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
    17. // 调用目标业务 方法
    18. method.invoke(this, request, response);
    19. } catch (Exception e) {
    20. // e.printStackTrace();
    21. }
    22. }
    23. }

    html代码:

    1. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <html>
    3. <head>
    4. <meta http-equiv="pragma" content="no-cache" />
    5. <meta http-equiv="cache-control" content="no-cache" />
    6. <meta http-equiv="Expires" content="0" />
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <title>Cookietitle>
    9. <base href="http://localhost:8080/13_cookie/"/>
    10. <style type="text/css">
    11. ul li {
    12. list-style: none;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <iframe name="target" width="500" height="500" style="float: left;">iframe>
    18. <div style="float: left;">
    19. <ul>
    20. <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建a>li>
    21. <li><a href="" target="target">Cookie的获取a>li>
    22. <li><a href="" target="target">Cookie值的修改a>li>
    23. <li>Cookie的存活周期li>
    24. <li>
    25. <ul>
    26. <li><a href="" target="target">Cookie的默认存活时间(会话)a>li>
    27. <li><a href="" target="target">Cookie立即删除a>li>
    28. <li><a href="" target="target">Cookie存活3600秒(1小时)a>li>
    29. ul>
    30. li>
    31. <li><a href="" target="target">Cookie的路径设置a>li>
    32. <li><a href="" target="target">Cookie的用户免登录练习a>li>
    33. ul>
    34. div>
    35. body>
    36. html>

    3. 服务器如何获取 Cookie

            服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[]

    Servlet 程序中的代码:
    1. protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. // 1.获取Cookie数组
    3. Cookie[] cookies = request.getCookies();
    4. // 遍历Cookie 数组
    5. for (Cookie cookie : cookies) {
    6. // getName 方法返回 Cookie 的 key(名)
    7. // getValue 方法返回 Cookie 的 value 值
    8. response.getWriter().write("Cookie【" + cookie.getName() + "=" + cookie.getValue() + "】
      "
      );
    9. }
    10. // 获取name为key2的cookie
    11. Cookie iWantCookies = CookieUtils.findCookie("key2", cookies);
    12. // 如果不等于 null,说明赋过值,也就是找到了需要的 Cookie
    13. if (iWantCookies != null) {
    14. response.getWriter().write("获取到了想要的cookie" + iWantCookies.getName() + "=" + iWantCookies.getValue() + "
      "
      );
    15. }
    16. }
    Cookie 的工具类:
    1. public class CookieUtils {
    2. /**
    3. * 查找指定名称的Cookie
    4. * @param name
    5. * @param cookies
    6. * @return
    7. */
    8. public static Cookie findCookie(String name, Cookie[] cookies) {
    9. if (name == null || cookies == null || cookies.length == 0) {
    10. return null;
    11. }
    12. for (Cookie cookie : cookies) {
    13. if (name.equals(cookie.getName())) {
    14. return cookie;
    15. }
    16. }
    17. return null;
    18. }
    19. }

    结果:

    4. Cookie 值的修改

    注意:对于 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。空值在所有浏览器上的行为不一定相同。也不能含有中文

    4.1 方案一

            1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
            2、在构造器,同时赋于新的 Cookie 值。
            3、调用 response.addCookie( Cookie );
    1. protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. // 方案一
    3. // 1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
    4. // 2、在构造器,同时赋于新的 Cookie 值。
    5. Cookie cookie = new Cookie("key1", "newValue1");
    6. // 3、调用 response.addCookie( Cookie );
    7. response.addCookie(cookie);
    8. response.getWriter().write("Cookie的ke1修改成功
      "
      );
    9. }

    4..2 方案二

    1 、先查找到需要修改的 Cookie 对象
    2 、调用 setValue() 方法赋于新的 Cookie 值。
    3 、调用 response.addCookie() 通知客户端保存修改
    1. protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. // 方案一
    3. // 1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
    4. // 2、在构造器,同时赋于新的 Cookie 值。
    5. Cookie cookie = new Cookie("key1", "newValue1");
    6. // 3、调用 response.addCookie( Cookie );
    7. response.addCookie(cookie);
    8. response.getWriter().write("Cookie的ke1修改成功
      "
      );
    9. // 方案二
    10. // 1、先查找到需要修改的 Cookie 对象
    11. Cookie cookie2 = CookieUtils.findCookie("key2", request.getCookies());
    12. // 2、调用 setValue()方法赋于新的 Cookie 值。
    13. cookie2.setValue("newValue2");
    14. // 3、调用 response.addCookie()通知客户端保存修改
    15. response.addCookie(cookie2);
    16. response.getWriter().write("Cookie的ke2修改成功
      "
      );
    17. }

    结果:

    5. 浏览器查看 Cookie

    5.1 谷歌浏览器如何查看 Cookie

    5.2 火狐浏览器如何查看 Cookie

    6. Cookie 生命控制

            Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
            setMaxAge()
                    正数,表示在指定的秒数后过期
                    负数,表示浏览器一关,Cookie 就会被删除(默认值是-1
                    零,表示马上删除 Cookie

    6.1 Cookie的默认存活时间

    1. protected void defaultLift(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. Cookie defaultLift = new Cookie("defaultLift", "defaultLift");
    3. defaultLift.setMaxAge(-1);
    4. response.addCookie(defaultLift);
    5. response.getWriter().write("Cookie的默认存活时间 设置成功");
    6. }

    6.2 Cookie的立即删除

    1. protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. // 先找到你要删除的 Cookie 对象
    3. Cookie defaultLift = CookieUtils.findCookie("defaultLift", request.getCookies());
    4. if (defaultLift != null) {
    5. // 调用 setMaxAge(0);
    6. defaultLift.setMaxAge(0);
    7. // 保存
    8. response.addCookie(defaultLift);
    9. response.getWriter().write("Cookie的defaultLift删除成功");
    10. }
    11. }

    6.3 设置存活 1 个小时的 Cookie

    1. protected void lift3600(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. Cookie lift3600 = new Cookie("lift3600", "lift3600");
    3. lift3600.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
    4. response.addCookie(lift3600);
    5. response.getWriter().write("存活 1 个小时的 Cooie 设置成功");
    6. }

    7. Cookie 有效路径 Path 的设置

    Cookie path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
    path 属性是通过请求的地址来进行有效的过滤。
            CookieA         path=/工程路径
            CookieB         path=/工程路径/abc
            请求地址如下:
                    http://ip:port/工程路径/a.html
                            CookieA 发送
                            CookieB 不发送
                    http://ip:port/工程路径/abc/a.html
                            CookieA 发送
                            CookieB 发送

    代码示例:

    1. protected void setPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. Cookie cookie = new Cookie("path", "path");
    3. // request.getContextPath() 得到工程路径
    4. cookie.setPath(request.getContextPath() + "/abc");
    5. response.addCookie(cookie);
    6. response.getWriter().write("创建了一个带有 Path 路径的 Cookie");
    7. }

    结果:

     

    8. Cookie 练习---免输入用户名登录

    思路流程:

  • 相关阅读:
    Ei & Scopus检索 | 2024年第三届能源与环境工程国际会议(CFEEE 2024)
    前端传字符串的开始时间和 结束时间,数据库时间字段是 timestamp,Java 代码如何写
    一文了解Nginx及其基本配置
    JavaScript 基础第二天笔记
    [C语言]对一段连续内存,多个结构体赋值的一种手段
    JavaWeb核心篇——Request和Response
    chargpt: 用纯c 写一9*9数独程序
    700. 二叉搜索树中的搜索
    〖大前端 - 基础入门三大核心之JS篇㊱〗- JavaScript 的DOM节点操作
    SpringCache_概述、Cacheable、更新缓存、删除缓存、从0搭建缓存项目
  • 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126048856