cookie相关基本知识
什么是cookie?
Cookie是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,通过调用HttpServletResponse,向客户端浏览器颁发一个Cookie。客户端浏览器就会将浏览器保存起来。(一般来说会保存,会有失败的情况,后面进行特别讲解。)当客户端再次请求时,客户端就会连同cookie一起提交给服务器,服务器就可以根据该cookie,得到用户的状态。当然服务器此时也可以修改该cookie。
cookie的获取和设置
Java中有一个专门的java.servlet.http.cookie类,可以通过操作该类来惊醒cookie的获取和设置。Cookie可以通过,request.getCookies();来获取。获得的是一个cookie数组。同时也可以通过response.addCookie(cookie)想客户端浏览器设置cookie。
cookie的不可跨域属性 (cookie跨域是一个大的知识,后面进行讲解。)
Cookie的域名设置方法为cookie.setDomain(domain);比如设置的域名为domain=www.baidu.com.这种情况下,设置的域名只能在www.baidu.com中使用,其他域名是无法获取到www.baidu.com下的域名。
www.baidu.com和wsx.www.baidu.com不是同一个域名。
cookie的属性
1、name字段为一个cookie的名称。
2、value字段为一个cookie的值。
3、domain字段为可以访问此cookie的域名。
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。
顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。
二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。
4、path字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。
5、expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。
6、Size字段 此cookie大小。
7、http字段 cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。
8、secure 字段 设置是否只能通过https来传递此条cookie
cookie的有效期,修改和删除
有效期
Cookie有效期的设置方法为:Cookie.setMaxAge(maxAge);
maxAge设置的时间即为cookie的有效期。一般以秒为单位。比如设置的时间为60,那么cookie的有效期为60秒。不随浏览器的关闭而消失。加入关闭浏览器又重新打开,那么此时若还没有到60秒,这个时候可以获取该cookie。
加入maxAge设置为-1,此时cookie的有效期随浏览器的关闭而清除(会话级cookie)。
修改
通过方法重新设置一次cookie,就是cookie的修改。但是除了cookievalue,和maxage其它配置不能修改,否则,cookie为不同的cookie。
Response.addCookie(cookie);
cookie的删除
将cookie的有效期设置为0。
Cookie跨域
简单跨域名访问
通过设置domain:
在任何域名下,cookie的domain参数都只能指定为当前域名或上级域名(包括上级的上级,等等),此外都是无效的。
如:在t.a.b.com下,指定domain为t.a.b.com、a.b.com、b.com都是可行的。
在domain的参数前,是否存在符号“.”是完全相同的。
如:domain=a.b.com和domain=.a.b.com是完全相同的。
脚本只可访问domain参数设置为当前域名或上级域名(包括上级的上级,等等)的cookie,以及当前域名下设置的没有domain参数的
cookie。如果不指定domain,则cookie无法在其他任何域名下被访问,即使是子域名。
指定domain与不指定domain的cookie是不相同的,即使下面的情况所产生的cookie也是不同的:
case1:在a.b.com下,设置无domain参数的cookie。
case2:在a.b.com下,设置domain=a.b.com的cookie。case1和case2所生成的cookie是完全不同的。
关于cookie的问题
1、通过swagger访问,生成的cookie带不进浏览器
这个时候先检查下自己的cookie是否设置了secure属性,和自己的请求是否是http的。设置了secure属性的情况下,http请求的情况下,生成的cookie存不到浏览器中。
2、前后端分离的情况下,前端的请求可能生不成cookie,而且即使生成时,可能会带不上cookie。
前端工程在请求后端工程时,有很多是ajax请求,ajax默认不支持携带cookie。
解决方案一:
ajax请求中加上字段 xhrFields: {withCredentials: true},这样可以携带上cookie。
这样后台配置就出现了限制,需要配置一个解决跨域访问的过滤器,而且header字段Access-Control-Allow-Origin的值不能为”*”, 必须是一个确定的域。(后端可以配置拦截器,对于每个respones设置header。)
解决方案二:
配置ngnix,不太懂。可参考:ngnix配置cookie跨域