欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

认知Cookie

程序员文章站 2022-07-14 11:18:26
...

什么是Cookie?

cookie的出现是为了解决http1.0无状态的问题,用来标识一个http会话的,一般cookie会和服务器上的session配套使用。Cookie存在浏览器中,每次发送请求,会把相应的cookie带到服务端,第一次发起请求,服务端会生成一个cookie返回给浏览器。

此处多说一下,随着http协议的发展,http逐渐支持持久连接,比如http1.1。

关于http1.0和http1.1的知识,可以参考此篇文章:

https://www.jianshu.com/p/52d86558ca57

Cookie的属性

认知Cookie

此图是Chrome浏览器存储cookie展示的属性。查看的路径:

设置->高级->内容设置->Cookie->查看所有 Cookie 和网站数据。

认知Cookie

或者在开发者工具中也可以看到。

Name:一个cookie的名称。

Value:一个cookie的值。

Domain可以访问此cookie的域名,可以设置完整的域名或者非*域名。

Path可以访问此cookie的页面路径,比如domain是.abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。

Expires/Max-Age字段为cookie的超时时间,若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

Size此cookie的大小。

Httpcookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。

Secure字段 设置是否只能通过https来传递此条cookie。

Cookie作用域

测试Cookie的作用域需要弄几个域名,修改C:\Windows\System32\drivers\etc\hosts文件,将本机ip映射出四个域名,如下:

127.0.0.1 wx1.abc.com

127.0.0.1 wx2.abc.com

127.0.0.1 wx1.com

127.0.0.1 wx2.com

前两个是一级域名(abc.com)相同,二级域名(wx1、wx2)不同,后两个是一级域名不同(关于域名的分级有其它说法,此处不做解释)。然后我们再写两个jsp,一个用于设置Cookie,另一个用于显示Cookie。

setCookie.jsp

<%
	Cookie cookie = new Cookie("test_key","test_value");
	response.addCookie(cookie);
%>

getCookie.jsp

<%
	Cookie[] cookies = request.getCookies();
	if(cookies !=null){
		for(Cookie cookie : cookies){
			out.println(cookie.getName()+"-"+cookie.getValue()+"<br/>");
		}
	}
%>

测试一:

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

认知Cookie

默认domain域名为当前域名,path默认为当前uri路径,session对应的cookie的path为项目名称Path路径的更改可以通过cookie.setPath("/")进行设置。

测试二:

在setCookie.jsp中增加如下代码:

cookie.setDomain(".com");

清除浏览器cookie缓存,先访问setCookie页面,再访问getCookie页面。


发现设置*域名,浏览器不会将cookie写入浏览器。

测试三:

setCookie.jsp中增加如下代码:

cookie.setDomain("abc.com");

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

认知Cookie

再访问:http://wx2.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

可以得出一个结论:cookie作用域为父级域名时,所有子级域名都可以得到该cookie。

测试四:

setCookie.jsp中增加如下代码:

cookie.setDomain("wx1.com");

先访问:http://wx2.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

在访问:http://wx2.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

此时在cookie中没有看到test_key的值,说明:cookie不能跨域名设置。

综上对cookie域名的总结:

1、Cookie默认作用域为当前域名。

2、Cookie作用域为父级域名时,所有子域名都可以得到该cookie(可实现同域名单点登录)。

3、Cookie不能跨域名设置,直接会被浏览器忽略。

4、Cookie不能将域名设置成*域名,直接会被浏览器忽略。

Cookie路径

测试一:

setCookie.jsp设置成如下:

<%
	Cookie cookie = new Cookie("test_key","test_value");
	cookie.setPath("/abc");
	response.addCookie(cookie);
%>

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

发现cookie值没有设置到浏览器中。

测试二:

setCookie.jsp中,修改成如下代码:

cookie.setPath("cookie_demo/jsp");

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

认知Cookie

在setCookie.jsp中,修改成如下代码:

cookie.setPath("abc");

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

认知Cookie

setCookie.jsp中,修改成如下代码:

cookie.setPath("/cookie_demo/jsp");

先访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/setCookie.jsp

再访问:http://wx1.abc.com:9999/cookie_demo/jsp/cookie/getCookie.jsp

认知Cookie

从以上实验可以发现,cookie中path的设置必须以“/”开头,如果不是以“/”开始,都是非法路径,cookie设置的path会使用默认规则,也就是当前的uri路径。

cookie路径的总结:

1、Path默认为当前uri路径,session对应的cookie的path为项目名称。

2、Path的值必须以“/”开始,否则路径非法,设置使用默认规则。

3、Path设置的路径必须是uri的路径或子路径,否则浏览器会默认忽略此cookie。

Cookie总结

一个http发送请求,能携带哪些cookie信息,是由cookie中的domain和path两个属性决定的。一般的规则是:先匹配domain,再匹配path,domain必须是当前请求的域名或者父域名,path必须是当前请求URI路径或者子路径如果二者都匹配,这个cookie才能被携带。

 

参考的文章:

https://www.cnblogs.com/tzyy/p/4151291.html

http://blog.csdn.net/ghsau/article/details/20395681

相关标签: cookie

上一篇: Ranger认知

下一篇: Spring认知