cookie

cookie是什么?

cookie是存储在浏览器中的纯文本,浏览器的安装目录会有专门的cookie文件夹存放各个域下设置的cookie。

cookie用途?

一般用于存储用户登录凭证,或者一些简单的业务信息。其容量有限,不适合存太多数据。

cookie如何使用?

如下所示,后端可以在response中通过addCookie操作,加入相应的cookie。

Cookie cookie = new Cookie("userId", loginLogVO.getUserId().toString());
cookie.setPath("/");
cookie.setDomain("xxx.com");
cookie.setMaxAge(30000);
response.addCookie(cookie);

客户端不需要做特殊的处理。浏览器识别到cookie有效的请求场合,会自动将相应的cookie作为header的一个字段发起请求。

什么情况下,cookie会存在问题?

  • cookie不支持设置在ip,localhost等请求domain下。

如http://localhost:8080或者http://192.168.1.10:8080下无法设置cookie。

  • cookie设置的domain

设置cookie时可以指定domain域名,子域名可以共享主域的数据,删除时也必须明确指定域名,否则无法删除。

设置cookie时不指定域名,使用默认值,则表示只有当前域名可见,删除时也不需要指定域名,否则无法删除。

  • cookie设置的path

不设置的情况下,只有设置该cookie的URI及其子路径可以访问,在做单点登录时,path设置为/,就可以支持域名下的任意路径都带上该数据。

  • cookie设置的expires

不设置的情况下,默认有效期为session,即会话cookie。设置的时候,格式必须是GMT格式的时间(可以通过 new Date().toGMTString()或者 new Date().toUTCString() 来获得)。

  • cookie设置的secure

当请求时https或者其它安全协议时,包含secure选项的cookie才能被发送到服务器。

  • cookie设置domain前面是否带'.'

带点:任何 subdomain 都可以访问,包括父 domain

不带点:只有完全一样的域名才能访问,subdomain 不能(但在 IE 下比较特殊,它支持 subdomain 访问)

  • 不符合规则约束

domain规则如下:

1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成 
2、必须是数字或字母开头

path规则如下:

1、字符必须是在 0x20-0x7E之间,并且不能出现”;”号

cookie value规则如下:

1、会自动去除开头和结尾的引号” 
2、如果包含以下规则字符则校验失败: 
c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f

  • 发生跨域请求

cors跨域时,是否携带cookie,存在如下限制:

.withCredentials()方法可以激活发送原始cookie的能力,不过只有在Access-Control-Allow-Origin不是一个通配符(*),并且Access-Control-Allow-Credentials为’true’的情况下才行.

后端在处理跨域时,需要做些相应的处理,

response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

前端才能在跨域成功的基础上带上cookie到后端。

原文地址:https://www.cnblogs.com/asfeixue/p/9226472.html