1.Cookie路径介绍
我们知道Cookie的属性有很多,其中有一个属性是路径。有些人认为Cookie的路径指的是Cookie在客户端的保存路径,其实并不是。
Cookie的路径是在服务器创建Cookie时设置的,它的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的那些Cookie归还给服务器。如图1-1所示:
图1-1 cookie路径
图1-1中,浏览器端保存的Cookie有三个,分别是Cookie1、Cookie2和Cookie3。它们三个的访问路径分别为:“/Example/cookie“、”/Example/“、”Example1/cookie“。浏览器访问服务器端的路径为:”http://localhost:8080/Example/cookie/a/index.jsp“。也就是说index.jsp页面的访问路径为:”/Example/cookie/a/“,该路径包含了Cookie1和Cookie2的路径,因此在访问index.jsp时,浏览器会将Cookie1和Cookie2发送给服务器。这就是Cookie的路径的作用,其中涉及到访问路径。
如果服务器创建Cookie时没有设置路径,那么该Cookie的路径是当前资源的访问路径。例如:在index.jsp页面中创建了一个Cookie,index.jsp页面的访问路径为“/Example/“,那么该Cookie的路径就是”/Example/“。如果服务器创建Cookie时设置了路径,那么Cookie的路径就是设置的路径,例如:cookie.setPath(“/Example/cookie”),那么该Cookie的路径就是”/Example/cookie“。
2.Cookie路径练习
通过上面对Cookie路径的介绍,我们对它有了一定的了解,现在通过一个案例来验证以上结论。具体步骤如下:
(1)创建一个web应用,Example20,在该应用下的WebRoot目录下新建一个目录cookie,并在该目录下新建一个jsp文件,名称为one.jsp,主要代码如例1-1所示:
例1-1 one.jsp
<body>
<%
Cookie cookie=new Cookie("one","hello");
response.addCookie(cookie);
%>
</body>
例1-1中,服务器创建cookie但是并没有设置其路径,那么该cookie的路径应为one.jsp的访问路径。
(2)将Example20发布到服务器,然后启动服务器,在谷歌浏览器端地址栏上输入:http://localhost:8080/Example20/cookie/one.jsp,然后查看cookie信息,如图1-2所示:
图1-2 cookie信息
由图1-2可知,cookie的路径是:“/Example20/cookie“,该路径正是one.jsp页面的访问路径。
(3)在WebRoot目录下的cookie目录中新建一个jsp文件,名称为two.jsp,主要代码如例1-2所示:
例1-2 two.jsp
<body>
<%
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
out.print(c.getName()+"="+c.getValue()+"<br>");
}
}
%>
</body>
(4)重新启动服务器,在浏览器端地址栏上输入:http://localhost:8080/Example20/cookie/two.jsp,并使用浏览器的开发者工具,查看请求信息中的cookie,如图1-3所示:
图1-3 请求信息
由图1-3可知,在访问two.jsp页面时,浏览器将名称为one和JSESSIONID的cookie归还给服务器。因为two.jsp页面的访问路径也是“/Example20/cookie”。JSESSIONID能够发送过来是因为它的路径是“/Example20/”,也包含在访问路径中,因此被浏览器发送过来。
(5)在浏览器端访问Example20工程的index.jsp页面,访问路径为:http://localhost:8080/Example20,使用开发者工具查看请求信息,观察名称为one的cookie是否在请求信息中,如图1-4所示:
图1-4 请求信息
由图1-4可知,访问index.jsp页面时,浏览器只将名称为JSESSIONID的cookie发送给服务器,而名称为one的cookie并没有发送服务器,原因是index.jsp页面的访问路径是“/Example20/”,而one的访问路径是“/Example20/cookie”,index.jsp页面的访问路径并不包含one的路径。
需要注意的是,大家不要将包含的关系弄混淆了,是访问路径包含cookie的路径。例如,浏览器中保存如下几个cookie,它们的路径分别是:
aCookie.path=/Example20/;bCookie.path=/Example20/jsps/;cCookie.path=/Example20/jsps/cookie
- 访问路径是:http://localhost:8080/Example20/index.jsp
浏览器发送给服务器的cookie有:aCookie;
- 访问路径是:http://localhost:8080/Example20/jsps/a.jsp
浏览器发送给服务器的cookie有:aCookie,bCookie;
- 访问路径是:http://localhost:8080/Example20/jsps/cookie/b.jsp
浏览器发送给服务器的cookie有:aCookie,bCookie,cCookie。
3.Cookie的域
Cookie还有一个属性就是域,Cookie类中有设置和获取cookie域的方法,如下所示:
- Void setDomain(String pattern):设置cookie的域;
- String getDomain():获取cookie的域,返回值的类型是String类型。
其中Domain单词就有域名的意思。一般我们很少使用cookie的域,只有在多个二级域共享Cookie时才用。例如:www.baidu.com、zhidao.baidu.com、news.baidu.com、tieba.baidu.com这些域可以理解是百度的子项目,现在要在这些域中共享cookie,就需要使用cookie的域,使用时需要注意以下两点:
- 设置domain为:setDomain(".baidu.com”);
- 设置path为:setPath(“/”)。
我们如果要自己设置Cookie的域,需要在电脑上配置虚拟主机,下面大家按照以下的步骤操作,如下:
(1) 在C:/WINDOWS/system32/drivers/etc/hosts文件中添加如下内容:
127.0.0.1 news.qdmmy6.com
127.0.0.1 tieba.qdmmy6.com
这两个域名后面两个单词要一致,如:qdmmy6.com。
(2) 在Tomcat的安装目录下的/conf/server.xml文件中添加如下配置:
<Host name="news.qdmmy6.com" appBase="news"
unpackWARs="true" autoDeploy="true">
<Value className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="tieba.qdmmy6.com" appBase="tieba"
unpackWARs="true" autoDeploy="true">
<Value className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
(3)点击此处下载 资源,将它们解压后拷贝到Tomcat的安装目录下。
(4)启动Tomcat服务器,在浏览器端访问:http://news.qdmmy6.com/SaveServlet.使用HttpWatch或者其他开发者工具查看请求响应信息,观察cookie的信息。
(5)在浏览器端访问:http://tieba.qdmmy6.com/GetServle,使用HttpWatch或者其他开发者工具查看请求响应信息,观察cookie的信息。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253176.html