一、 导读

本文大纲

  • 读取HTTP Cookie
  • 设置HTTP Cookie
  • 读取所有Cookie[]
  • 为Cookie设置过期时间
  • Https与Cookie
  • HttpOnly Cookie
  • 删除Cookie

HTTP Cookie(也称为Web cookie浏览器cookie)是服务器在用户浏览器中存储的小部分数据。服务器端应用程序在返回浏览器请求响应的时候设置cookie,浏览器存储cookie,并将它们在下一个请求一起发送的时候自动带回服务器端应用程序。

Cookies提供了一种在服务器和浏览器之间交换信息的方法,以管理会话(登录,购物车,游戏得分),记住用户首选项(主题,隐私策略接受)以及跟踪整个站点的用户行为。Cookies在一定程度上解放了服务器端的压力,因为将一部分数据放在浏览器端存储,所以这部分数据不能是涉及应用安全的数据。在本文中,我们将学习如何在Spring Boot应用程序中读取、设置和删除HTTP cookie。

二、读取HTTP Cookie

Spring框架提供@CookieValue注释来获取HTTP cookie的值,此注解可直接用在控制器方法参数中。



@GetMapping("/")
public String readCookie(@CookieValue(value = "username",
defaultValue = "Atta") String username) {
return "Hey! My username is " + username;
}

在上述代码段中,请注意defaultValue = "Atta"。如果没有设置默认值,并且没有找到名称为username的Cookie,Spring将抛出java.lang.IllegalStateException异常。

三、设置HTTP Cookie

要在Spring Boot中设置cookie,我们可以使用HttpServletResponse类的方法addCookie()。您需要做的就是创建一个新的Cookie对象并将其添加到响应中。


@GetMapping("/change-username")
public String setCookie(HttpServletResponse response) {
// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan"); //将cookie对象加入response响应
response.addCookie(cookie); return "Username is changed!";
}

四、读取所有Cookie[]

除了使用@CookieValue注解,我们还可以使用HttpServletRequest类作为控制器方法参数来读取所有cookie。此类提供了getCookies()方法,该方法以数组形式返回浏览器发送的所有cookie。


@GetMapping("/all-cookies")
public String readAllCookies(HttpServletRequest request) { Cookie[] cookies = request.getCookies();
if (cookies != null) {
return Arrays.stream(cookies)
.map(c -> c.getName() + "=" + c.getValue())
.collect(Collectors.joining(", "));
} return "No cookies";
}

五、为Cookie设置过期时间

如果没有为cookie指定过期时间,则其生命周期将持续到Session过期为止。这样的cookie称为会话cookie。会话cookie保持活动状态,直到用户关闭其浏览器或清除其cookie。但是您可以覆盖此默认行为,并使用类的setMaxAge()方法设置cookie的过期时间。


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setMaxAge(7 * 24 * 60 * 60); // 7天过期 //将cookie对象加入response响应
response.addCookie(cookie);

现在,usernameCookie不会因为Seesion结束到期,而是会在接下来的7天保持有效。传递给setMaxAge()方法的到期时间以秒为单位。到期日期和时间是相对于设置cookie的客户端而不是服务器而言的。

六、Https与Cookie

我们需要了解一个概念:什么的安全的Cookies?安全的cookie是仅可以通过加密的HTTPS连接发送到服务器的cookie。无法通过未加密的HTTP连接将cookie发送到服务器。也就是说,如果设置了setSecure(true),该Cookie将无法在Http连接中传输,只能是Https连接中传输。


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setSecure(true); //Https 安全cookie //将cookie对象加入response响应
response.addCookie(cookie);

七、HttpOnly Cookie

HttpOnly cookie用于防止跨站点脚本(XSS)攻击,也就是说设置了Http Only的Cookie不能通过JavaScript的Document.cookieAPI访问,仅能在服务端由服务器程序访问。


// 创建一个 cookie对象
Cookie cookie = new Cookie("username", "Jovan");
cookie.setHttpOnly(true); //不能被js访问的Cookie //将cookie对象加入response响应
response.addCookie(cookie);

八、删除Cookie

要删除Cookie,需要将Max-Age设置为0,并且将Cookie的值设置为null。不要将Max-Age指令值设置为-1负数。否则,浏览器会将其视为会话cookie。


// 将Cookie的值设置为null
Cookie cookie = new Cookie("username", null);
//将`Max-Age`设置为0
cookie.setMaxAge(0); response.addCookie(cookie);

期待您的关注

最新文章

  1. HDU--航海舰队
  2. Java中的受检异常
  3. Excel快速改变行列的次序
  4. System V IPC(3)-共享内存
  5. [Machine-Learning] 机器学习中的几个度量指标
  6. 【使用git】初识git
  7. sealed修饰符
  8. Java:字符串类String的功能介绍
  9. MongoDB索引介绍
  10. [PWA] 10. Trigger a version update
  11. PHP文件夹操作
  12. Android调试工具之ADB
  13. HDFS深度历险 之 从客户端逻辑看HDFS写入机制
  14. 算法(第四版)C# 习题题解——1.5
  15. 三 、 Multivariance Linear Regssion练习(转载)
  16. 树莓派3中编译Opencv3.4.10
  17. ALGO-22_蓝桥杯_算法训练_数的划分(DP)
  18. delphi 控制音量 静音的类
  19. python3.6.5 路径处理与规范化
  20. Web安全之XSS(Cross Site Scripting)深入理解

热门文章

  1. layDate——设置最大日期不能超过当前日期
  2. 阿里云服务器CentOS6.9 nexus私服使用
  3. vue 引入 fontawesome 报错 Could not find one or more icon(s) 解决
  4. linux 装composer的出现的问题
  5. JavaSE----02.Java语言基础
  6. PHP生成唯一ID的方法
  7. KafkaStream低级别API
  8. python编程基础之六
  9. 用到的Dos命令总结 持续更新
  10. BZOJ 4392 卡牌游戏