Cookie

Cookie 介绍

Cookie 的中文翻译是曲奇,小甜饼的意思。它其实就是一些数据信息,类型为“小型文本文件”,存储于电脑上的文本文件中。

它有什么用呢?

我们想象一个场景,当我们打开一个网站时,如果这个网站我们曾经登录过,那么当我们再次打开网站时,发现就不需要再次登录了,而是直接进入了首页。例如 bilibili,csdn 等网站。

这是怎么做到的呢?其实就是浏览器保存了我们的 Cookie ,里面记录了一些信息。当然,这些 Cookie 是服务器创建后返回给浏览器的,浏览器只进行了保存。

Cookie 结构

一般情况下,Cookie 是以键值对进行表示的(key-value),例如 name=jack,这个就表示 Cookie 的名字是 name ,Cookie携带的值是 jack。

Cookie 常用属性

属性 描述
Name 这个是 Cookie 的名字
Value 这个是 Cookie 的值
Path 这个定义了 Web 站点上可以访问该 Cookie 的目录
Expires 这个值表示 Cookie 的过期时间,也就是有效值,Cookie在这个值之前都有效
Size 这个表示 Cookie 的大小

Cookie 的 HTTP 传输

HTTP 请求

在发送 HTTP 请求时,浏览器会将我们的 Cookie 都携带在请求头中

注意:浏览器只会携带在当前请求的 URL 中包含了该 Cookie 中 Path 值的 Cookie ,并且是以 key:value 的形式进行表示的。多个 Cookie 用分号进行隔开。

HTTP 响应

当服务器设置了 Cookie 并返回给浏览器时,通过抓包我们可以观察到在 HTTP 响应头中,Cookie 的表示形式是通过 Set-Cookie 字段来进行的。

每个 Cookie 都以 Set-Cookie 的形式表示,包括 Cookie 的名字和值。如果有多个 Cookie ,那么在 HTTP 响应中就会有多个 Set-Cookie 字段。

Cookie 的生命周期

Cookie 有两种存储方式:会话性和持久性。

  • 会话性:Cookie 仅保存在客户端的内存中。当关闭客户端时,Cookie也就失效了。

  • 持久性:Cookie 保存在用户的硬盘中,直至生存期结束或用户主动将其销毁。

我们可以通过设置 Cookie 的有效时间来人为地控制其生命周期,包括何时创建以及何时销毁。

Java 中的 Cookie

Cookie 对象方法

方法 描述
new Cookie(String name, String value) 创建一个Cookie对象,必须传入Cookie的名字和值。
getValue() 获取Cookie保存的值。
getName() 获取Cookie的名字。
setMaxAge(int expiry) 设置Cookie的有效期,默认为-1。如果设置为负数,表示客户端关闭后Cookie会被删除;设置为0表示立即删除;正数表示有效时间,单位是秒。
setPath(String uri) 设置Cookie的作用域。

相关方法

HttpServletRequestHttpServletResponseCookie 进行操作的方法

方法 描述
response.addCookie(Cookie cookie) 将 Cookie 发送给客户端进行保存。
request.getCookies() 获取客户端发送的所有 Cookie 对象。

Cookie 实战案例

需求分析

我们使用 cookie 来实现一个功能,就是当用户登录成功后,我们在下次登录时就自动填入用户名和密码。

这个功能我们使用 cookie 和 jsp 页面来完成

写代码

登录页面(jsp 页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

<html>
  <head>
    <title>登录</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/main" method="post">
      用户名:<input type="text" name="username" value="<%=request.getAttribute("username")%>"><br/>
      密 码:<input type="password" name="password" value="<%=request.getAttribute("password")%>"><br/>
      <input type="submit" value="登录">
    </form>
  </body>
</html>

请求转发页面,我们是通过访问 Servlet 转发到 jsp 页面的,而不是直接访问

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/cookieLogin")
public class CookieLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置默认值
        request.setAttribute("username","");
        request.setAttribute("password","");
        //得到所有 cookie
        Cookie[] cookies = request.getCookies();
        //对所有 cookie 进行遍历
        for (Cookie cookie : cookies) {
            //得到存储用户名和密码的 cookie 并且存入 request 域中
            if ("username".equals(cookie.getName())){
                String value = cookie.getValue();
                request.setAttribute("username",value);
            }
            if("password".equals(cookie.getName())){
                String value = cookie.getValue();
                request.setAttribute("password",value);
            }
        }
        //转发到 login.jsp 页面
        request.getRequestDispatcher("/login.jsp").forward(request,response);
    }

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

处理登录请求,并返回登录成功后的首页

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/main")
public class MainServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型
        response.setContentType("text/html;charset=utf-8");
        //得到用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //判断是否登录成功
        if ("root".equals(username) && "root".equals(password)) {
            //编写 cookie
            Cookie usernameCookie = new Cookie("username", username);
            Cookie passwordCookie = new Cookie("password", password);
            //设置有效时间,我这里设置3天有效
            usernameCookie.setMaxAge(60 * 60 * 24 * 3);
            passwordCookie.setMaxAge(60 * 60 * 24 * 3);
            //存入客户端
            response.addCookie(usernameCookie);
            response.addCookie(passwordCookie);
            //返回提示
            response.getWriter().write("<h1>登录成功~~~~</h1>");
        }else {
            response.getWriter().write("<h1>登录失败....</h1>");
        }
    }

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

测试代码

  • 首先访问:http://localhost:8080/cs/cookieLogin ,此时,没有自动填写,因为我们还没有登录。浏览器中也没有存有用户名和密码的cookie

  • 输入正确的账号和密码进行登录,页面显示登录成功,此时,查看一下浏览器是否存储了用户名和密码的 cookie,浏览器确实存储了 cookie,没有问题

  • 关闭游览器后重新访问登录页面,此时,用户名和密码就自动填写了,成功实现了功能

总结

  • Cookie 就是一些数据,用于存储服务器返回给客服端的信息,客户端进行保存。

  • 在下一次访问该网站时,客户端会将保存的 cookie 一同发给服务器,服务器再利用 cookie 进行一些操作。

  • 利用 cookie 我们就可以实现自动登录,保存游览历史,身份验证等功能。

来自河南
感谢观看!欢迎联系或留言!
码字不易!转载请标明来源——
- 文章:Cookie
- 作者:longlong
- 链接:https://blog.long-code.cn/index.php/2024/03/10/314/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇