Spring Boot -Cookies

Spring Boot - Cookies | Xing's Blogicon-default.png?t=M0H8https://xinghua24.github.io/SpringBoot/Spring-Boot-Cookies/

让我们学习如何在 Spring Boot 应用程序中使用 cookie。

什么是 HTTP Cookie

HTTP cookie(Web cookie,浏览器 cookie)是服务器发送到用户 Web 浏览器的一小段数据。浏览器可以存储它并将其与以后的请求一起发送回同一服务器。通常,它用于判断两个请求是否来自同一个浏览器——例如,让用户保持登录状态。它为无状态 HTTP 协议记住有状态信息。

会话管理登录、购物车、游戏分数或服务器应记住的任何其他内容

个性化用户偏好、主题和其他设置

跟踪记录和分析用户行为

来自服务器的Set-CookieHTTP 响应标头在客户端设置 cookie。这是一个示例 HTTP 响应,它使用 key 设置 cookie foo。此 cookie 于 2020 年 6 月 18 日 02:39:49 GMT 到期。

HTTP/1.1 200
Set-Cookie: foo=bar; Max-Age=604800; Expires=Thu, 18-Jun-2020 02:39:49 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 16
Date: Thu, 11 Jun 2020 02:39:49 GMT
Keep-Alive: timeout=60
Connection: keep-alive

随后的 HTTP 请求将Cookie设置标头以包含 Cookie 值。

GET /readCookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;
Cookie: foo=bar

您还可以使用 Javascript 设置 cookie。Hre 是一个设置名为foovalue的 cookie 的示例bar

document.cookie = "foo=bar"

您可以在存储/Cookie 会话下的应用程序选项卡中检查站点的 cookie。

Cookie 操作

您可以创建一个 cookie 实例并将 cookie 添加到 Http 响应中。您可以为 Cookie 设置一些属性。

cookie的MaxAge属性设置 cookie 的过期时间。默认为-1-1表示它是一个会话 Cookie。当用户关闭浏览器时,会话 cookie 将被删除。

带有该Secure属性的 cookie 仅通过 HTTPS 协议与加密请求一起发送到服务器。将此属性设置为 true 以防止中间人附加。

HttpOnlyJavaScript Document.cookie API 无法访问具有该属性的 cookie 。将此属性设置为 true 以防止跨站点脚本 (XSS) 攻击。

Domain属性指定允许哪些主机接收 cookie。如果未指定,则默认为设置 cookie 的同一来源,不包括子域。

Path属性指示在请求的 URL 中必须存在的 URL 路径,以便发送 Cookie 标头。

// http://localhost:8080/setCookie
@GetMapping("/setCookie")
public String setCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie cookie = new Cookie("foo", "bar");
    cookie.setSecure(false);
    cookie.setHttpOnly(false);
    cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
    response.addCookie(cookie);
    return "cookie is added!";
}

您可以使用@CookieValue注释来读取 cookie 的值

// http://localhost:8080/readCookie
@GetMapping("/readCookie")
public String readCookie(@CookieValue("foo") String fooCookieValue) {
    return "The value of foo cookie is " + fooCookieValue;
}

另一种获取 Cookie 值的方法是通过WebUtils。WebUtils 有一个getCookie方法来获取具有给定名称的第一个 cookie,如果没有找到,则返回 null。

Cookie cookie = WebUtils.getCookie(request, "foo");

获取所有 Cookie

您可以从 Http 请求中获取所有 cookie。


// http://localhost:8080/readAllCookie
@GetMapping("/readAllCookie")
public String readAllCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    if( cookies != null) {
        return Stream.of(cookies).map(c-> c.getName() + "=" + c.getValue()).collect(Collectors.joining("<br>"));
    }
    return "No cookie is found!";
}

要删除 cookie,请取消设置其值并将其 MaxAge 设置为 0。确保属性也匹配。

// http://localhost:8080/deleteCookie
@GetMapping("/deleteCookie")
public String deleteCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie cookie = new Cookie("foo", null);
    cookie.setMaxAge(0);
    cookie.setSecure(false);
    cookie.setHttpOnly(false);
    response.addCookie(cookie);

    return "cookie is deleted!";
}

参考

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值