使用cookie.setPath()
能够设置cookie的携带路径,若是不设置默认也会有一个携带路径,默认为当前路径的上一级路径
啥意思?我们来探究一下吧!java
先上个Demoweb
建立Cookie的Servlet:cookie
@WebServlet("/demo1") public class Demo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie=new Cookie("username","zhangsan"); response.addCookie(cookie); } }
获取Cookie的Servlet:session
@WebServlet("/demo2") public class Demo2 extends HttpServlet { @Override protected 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信息写回到客户端ide
再次访问demo2会发现请求头上会携带username=zhangsan
的cookie信息svg
利用这个咱们能够很好的解决Cookie实现自动登陆问题测试
思路:当用户登陆一次时把用户数据存储到Cookie写回到客户端,下一次客户再来登陆的时候会携带用户的Cookie信息,再把Cookie信息转为user,存入session就实现了自动登陆spa
可是要注意一个点:并非全部请求都会携带存储到客户端的Cookie信息code
看个东西:xml
/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 { @Override protected 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 { @Override protected 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 { @Override protected 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 下的全部请求携带 |