博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cookie中的domain和path
阅读量:5297 次
发布时间:2019-06-14

本文共 3688 字,大约阅读时间需要 12 分钟。

1.cookie中的domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello, 那么响应中的set-Cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来组织cookie的。 我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会去保存这些domain为其他域的cookie。

2.cookie中的path能够进一步的控制cookie的访问,当path=/; 当前域的所有请求都可以访问到这个cookie。 如果path设为其他值,比如path=/test,那么只有/test下面的请求可以访问到这个cookie。

纸上得来终觉浅,绝知此事要躬行。

首先我们来看看默认情况下的cookie的domain和path是什么。服务端使用servlet。

//这里故意将url设置的特别长,方便观察path的默认值@WebServlet("/test/test1/test2.html")public class TestServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Cookie nameCookie = new Cookie("name", "zhangsan");        response.addCookie(nameCookie);                try(PrintWriter out = response.getWriter()){ out.print("set name cookie"); }    }}

 

上面的cookie没有任何特别设置,只有基本的名和值。响应的头信息中也是最基本的情况,如下图:

我们现在可以看看浏览器中保存了什么了。

我们从浏览器的保存情况中可以看出: 1. 浏览器是按照domain域来组织cookie的。

                  2. domain的默认值为请求的域名。

                  3. path的默认值为请求的上一层目录(请求为:/hello/test/test1/test2.html, path为/hello/test/test1)

 

更改cookie的domain和path值

我们可以改变cookie的domain和path的值,看看会发生什么。

@WebServlet("/test/test1/test2.html")public class TestServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Cookie nameCookie = new Cookie("name", "zhangsan");        nameCookie.setDomain("www.example2.com");//domain 更改为其他的域名        response.addCookie(nameCookie);        Cookie ageCookie = new Cookie("age", "11");        ageCookie.setPath("/"); //path 更改为根目录        response.addCookie(ageCookie);                try(PrintWriter out = response.getWriter()){ out.print("set name and age cookies"); }    }}

 

上面的代码中我们返回了两个cookie,nameCookie更改了domain,ageCookie更改了path,我们看看会发生些什么。

首先还是看看响应的头信息:

我们在代码中的改动完全反映到了响应的头信息中,但是浏览器的保存结果可能和你想象的不太一样。如下图:

我们看到浏览器仅仅保存了ageCookie,并没有保存nameCookie,实际上就是因为浏览器不会从一个响应中保存其他域名的cookie。

在网上看到一些关于更改domain的文章,包括使用js来实现的,但是我实践的结果都是不可以的。

 

path控制cookie的访问

我们不仅无法访问到其他域的cookie,我们同样无法访问到当前请求的url不在path属性之下的cookie。

@WebServlet("/test/test1/test2.html")public class TestServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Cookie nameCookie = new Cookie("name", "zhangsan");        response.addCookie(nameCookie);        Cookie ageCookie = new Cookie("age", "11");        ageCookie.setPath("/"); //path 更改为根目录        response.addCookie(ageCookie);                try(PrintWriter out = response.getWriter()){ out.print("set name and age cookies"); }    }}

 

上面的代码中nameCookie使用默认path,也就是 /hello/test/test1, ageCookie使用根目录作为path。 我们从两个不同的路径来访问cookie,代码如下:

//@WebServlet("/test/test2/access.html")@WebServlet("/test/test1/access.html")public class AccessServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        try(PrintWriter out = response.getWriter();){            Cookie[] cs = request.getCookies();            if(cs != null){                for(Cookie c : cs){                    out.print(c.getName() + " --> " + c.getValue());                }            }        }    }}

 

分别从两个url来访问,结果/test/test2/access.html仅仅能访问到age,而/test/test1/access.html能够访问到age和name。 

 

注意:在Apache Http Server 反向代理中,如果我们不去更改cookie中domain和path的值,就有可能出现 浏览器根本不会去保存这个cookie或者即使保存了也无法正常访问的情况。

 

转载于:https://www.cnblogs.com/zh1164/p/6529871.html

你可能感兴趣的文章
架构必备(转)
查看>>
ElasticSearch+NLog+Elmah实现Asp.Net分布式日志管理
查看>>
kubernetes基础
查看>>
利用原生js做了一个扫雷
查看>>
javascript
查看>>
项目启动报java.io.EOFException异常
查看>>
RabbitMQ入门:Hello RabbitMQ 代码实例
查看>>
ie6下使用min-height的方法
查看>>
解析ArcGis的字段计算器(二)——有玄机的要素Geometry属性,在属性表就能查出孔洞、多部件...
查看>>
c++ const enum #define
查看>>
初次来博客园
查看>>
Restful风格wcf调用2——增删改查
查看>>
最近使用asp.net时遇到 "运行时错误" 解决方案
查看>>
比例简化
查看>>
centos mysql 修改端口
查看>>
xcode4 设置调试错误信息小结
查看>>
asp.net 文件下载 支持断点续传
查看>>
angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)...
查看>>
Android ViewPager滑动导航菜单
查看>>
50%记录的函数
查看>>