HTTP Cookie(也称为web Cookie、浏览器Cookie)是服务器存储在用户浏览器中的一小块信息。服务器在返回浏览器请求的响应时设置cookies。浏览器存储cookies,并将它们与下一个请求一起发送回同一服务器。Cookie通常用于会话管理、用户跟踪和存储用户首选。Cookies帮助服务器跨多个请求记住客户机。如果没有cookies,服务器将把每个请求都当作一个新的客户机来处理。
1 Reading HTTP Cookie
Spring框架提供@CookieValue
注释来获取任何http cookie的值,而无需迭代从请求中获取的所有cookie。此注释可用于将cookie的值映射到控制器方法参数。
@GetMapping("/cookie")
public String readCookie(@CookieValue(value = "username", defaultValue = "hust") String username,
@CookieValue(value = "password", defaultValue = "hust") String password,
@CookieValue(value = "age", defaultValue = "hust") String age) {
return "hi, " + username + ", " + password + ", " + age;
}
在上面的代码片段中,请注意defaultValue=“Atta”。如果未设置默认值,Spring将抛出java.lang.IllegalStateException异常在HTTP请求中找不到名为username的cookie时出现异常。
2 Setting HTTP Cookie
要在Spring Boot中设置cookie,可以使用HttpServletResponse
类的addCookie()
方法。您所需要做的就是创建一个新的Cookie类实例并将其添加到响应中。
@GetMapping("/set-cookies")
public String setCookie(HttpServletResponse response) {
// create a cookie
Cookie cookie = new Cookie("username", "Tom");
// cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
// cookie.setSecure(true); //安全cookie是仅通过加密的HTTPS连接发送到服务器的cookie。安全Cookie不能通过未加密的HTTP连接传输到服务器。
// cookie.setHttpOnly(true); //当为cookie设置HttpOnly标志时,它会告诉浏览器只有服务器才能访问此特定cookie。
// cookie.setPath("/");
//add cookie to response
response.addCookie(cookie);
return "username is set!";
}
3 Reading All Cookies
我们也可以使用HttpServletRequest
类作为控制器方法参数来读取所有cookie,而不是使用@CookieValue
注释。此类提供getCookies()
方法,该方法将浏览器发送的所有Cookie作为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";
}