我最新最全的文章都在 南瓜慢说 www.pkslow.com,欢送大家来喝茶!
1 简介
HTTP Cookies
是服务器发送到用户浏览器并保留在本地的一小块数据,它会在浏览器下次向同一服务器再发动申请里被携带并发送到服务器上。
Cookie 次要用于以下三个方面:
- 会话状态治理(如用户登录状态、购物车、游戏分数或其它须要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪剖析用户行为等)
2 Chrome 查看 Cookies
通过 Chrome
弱小的工具,能够间接查看Cookies
,如上面所示:
3 Cookies 的属性
3.1 限度拜访 Cookie
3.1.1 Secure 标记
标记为 Secure
的Cookie
只能被 HTTPS
协定加密过的申请发送给服务端,应用 HTTP
是不行的,但 localhost
除外。
3.1.2 HttpOnly 标记
标记为 HttpOnly
的Cookie
只能通过 HTTP
传输,而无奈在客户端本地通过 JavaScript
拜访。这有助于缓解 跨站点脚本 (XSS)
攻打。
3.2 Cookie 的作用域
3.2.1 Domain 属性
用于指定哪些主机能够承受Cookie
,如果不指定,默认为Origin
,不蕴含子域名。如果指定了Domain
,则个别蕴含子域名。所以,指定 Doain,限度其实更少。
比方,如果 Domain=pkslow.com
,那blog.pkslow.com
也能够承受。
3.2.2 Path 属性
指定哪些门路能够承受Cookie
,子门路也会匹配。
比方,如果Path=/post
,那以下都能够匹配:
- /post
- /post/1
- /post/1/update
4 Springboot 操作 Cookies
4.1 获取
4.1.1 通过注解 @CookieValue
@RequestMapping("/hello")
public String hello(@CookieValue("foo") String fooCookie) {// ...}
4.1.2 通过工具类 WebUtils 的 getCookie 办法
public static Cookie getCookie(HttpServletRequest request, String name) {Assert.notNull(request, "Request must not be null");
Cookie[] cookies = request.getCookies();
if (cookies != null) {Cookie[] var3 = cookies;
int var4 = cookies.length;
for(int var5 = 0; var5 < var4; ++var5) {Cookie cookie = var3[var5];
if (name.equals(cookie.getName())) {return cookie;}
}
}
return null;
}
4.1.3 WebFlux 的 ServerWebExchange 获取
HttpCookie value = exchange.getRequest().getCookies().getFirst("foo");
4.2 返回
与获取反着来就行了,获取是从 Request
中拿数据;发送就是把数据放到 Response
中去。
response.addCookie();
5 发送 Cookie
5.1 浏览器
浏览器会依据规定发送,这个不必开发人员本人解决。
5.2 Postman
Postman
能够在这里设置:
5.3 curl 命令
curl -v --cookie "key1:value1;key2:value2;" http://localhost:8080/
5.4 JavaScript fetch 办法
credentials
是 Request
接口的只读属性,用于示意用户代理是否应该在跨域申请的状况下从其余域发送 cookies。这与 XHR 的 withCredentials 标记类似,不同的是有三个可选值(后者是两个):
omit
: 从不发送 cookies.same-origin
: 只有当 URL 与响应脚本同源才发送 cookies、HTTP Basic authentication 等验证信息.(浏览器默认值, 在旧版本浏览器,例如 safari 11 仍旧是 omit,safari 12 已更改)include
: 不论是不是跨域的申请, 总是发送申请资源域在本地的 cookies、HTTP Basic authentication 等验证信息.
为了让浏览器发送蕴含凭据的申请(即便是跨域源),要将 credentials: 'include'
增加到传递给 fetch()
办法的 init
对象。
fetch('https://example.com', {credentials: 'include'})
如果你只想在申请 URL 与调用脚本位于同一起源处时发送凭据,请增加 credentials: 'same-origin'
。
// The calling script is on the origin 'https://example.com'
fetch('https://example.com', {credentials: 'same-origin'})
要改为确保浏览器不在申请中蕴含凭据,请应用 credentials: 'omit'
。
fetch('https://example.com', {credentials: 'omit'})
6 总结
开发中遇到了一些 Cookies
问题,整顿了一下相干的知识点。
欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …
多读书,多分享;多写作,多整顿。