Cookie 携带路径详解
Cookie携带路径详解
使用cookie.setPath()可以设置cookie的携带路径,如果不设置默认也会有一个携带路径,默认为当前路径的上一级路径
啥意思?咱们来探究一下吧!
先上个Demo
创建Cookie的Servlet:
@WebServlet("/demo1")
public class Demo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie cookie=new Cookie("username","zhangsan");response.addCookie(cookie);}
}
获取Cookie的Servlet:
@WebServlet("/demo2")
public class Demo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie[] cookies = request.getCookies();if(cookies!=null){for(Cookie c:cookies){System.out.println(c.getName());System.out.println(c.getValue());}}}
}
访问demo1,会发现响应头会携带一个刚刚设置的cookie信息写回到客户端

再次访问demo2会发现请求头上会携带username=zhangsan的cookie信息

利用这个我们可以很好的解决Cookie实现自动登录问题
思路:当用户登录一次时把用户数据存储到Cookie写回到客户端,下一次客户再来登录的时候会携带用户的Cookie信息,再把Cookie信息转为user,存入session就实现了自动登录
但是要注意一个点:并不是所有请求都会携带存储到客户端的Cookie信息
看个东西:

/Test是我整个项目的访问路径,那么我整个项目下的所有访问路径都会携带此Cookie,没什么太大问题
为什么此Cookie的携带路径为/Test呢?
那是因为Cookie的携带路径在创建的时候就已经指定了,默认为当前路径的上一级
即:当前Servlet的虚拟路径的上一级

/demo1已经是根目录了,上一级就是整个项目的访问路径,也就是/Test
我们换个例子
创建Cookie的Servlet:
/*将此Servlet的虚拟路径改为/user/login也就是二级路径那么他的上一级是/user也就是在此Servlet内创建的Cookie默认携带范围为/Test/user下的所有路径(setPath()可以修改cookie的携带范围路径)*/
@WebServlet("/user/login")
public class Demo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie cookie=new Cookie("username","zhangsan");response.addCookie(cookie);}
}
获取Cookie的Servlet (此时就获取不了Cookie了)
@WebServlet("/demo2")
public class Demo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie[] cookies = request.getCookies();if(cookies!=null){for(Cookie c:cookies){System.out.println(c.getName());System.out.println(c.getValue());}}}
}
首先访问/user/add

可以看到响应上有携带Cookie信息

再次访问demo2,发现已经不再携带Cookie信息了
可以调用在响应cookie之前设置cookie的携带路径setPath("/");代表所有路径下都会携带此cookie信息,或者设置为setPath(request.getContextPath())
重新响应Cookie,并把Cookie的携带路径设置为/
@WebServlet("/user/add")
public class Demo01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie cookie=new Cookie("username","zhangsan");cookie.setPath("/");response.addCookie(cookie);}
}

重新测试

总结
咱们在做项目的时候没有设置Cookie的携带路径好像也没有问题,那是因为咱们一般登录请求为就为/login,上一级路径就是当前项目了,因此cookie的携带路径要不为/(没有设置项目访问路径),要么就为request.getContentPath()(因为/login的上一级路径就是当前项目),因此很少人注意这个问题
来个表格总结一下:
| 签发cookie时的路径 | cookie默认的携带路径 | 哪些请求携带此cookie |
|---|---|---|
/login | 如果有设置项目名:/项目名/,如果没有设置项目名:/ | 整个项目都携带 |
/user/login | /user | /user下的所有请求携带 |
/user/admin/login | /user/admin | /user/admin下的所有请求携带 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
