------------------------------- cookie的路径-------------------------------------

Cookie的路径

Cookie还有一个path属性,可以通过Cookie#setPath(String)方法来设置。你可以使用HttpWatch查看响应中的Set-Cookie中是否存在路径。下面是通过FireFox查看Cookie信息。

Chrome 数据目录 cookies文件_cookie

 

也就是说,就算你不设置Cookie的path,Cookie也是有路径的。这个路径就是请求的路径。例如在请求http://localhost/day07_03/AServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/。

例如请求的路径是http://localhost/day07_03/servlet/BServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/servlet/。

Chrome 数据目录 cookies文件_服务器_02

 

到现在我们还没说过Cookie的path有什么用,现在我们来聊聊path的作用。首先声明一点,path不是指Cookie在客户端存放的路径!!!不同的浏览器存放Cookie的路径是不同的!!!你不能通过Cookie的path来指定Cookie文件的存放路径!!!

那么Cookie的path是干什么的呢?假设你的浏览器当前已经有了两个Cookie:

    1. c1:name=id; value=itcast; path=/day07_03/;
    2. c2:name=name; value=qdmmy6; path=/day07_03/servlet/。

    当访问http://localhost/day07_03/*时,请求头中会包含c1,而不会包含c2。

    当访问http://localhost/day07_03/servlet/*时,请求头中会包含c1和c2。

    也就是说,在访问子路径时,会包含其父路径的Cookie,而在访问父路径时,不包含子路径的Cookie。

    Chrome 数据目录 cookies文件_用户名_03

     

    如果你想在BServlet中设置的Cookie,在客户端访问AServlet时也包含在请求头中,那么就需要设置BServlet中的Cookie的path:

    1. c2.setPath(“/day07_03/”):硬编码;
    2. c2.setPath(request.getContextpath() + “/”):活编码。

     

    这样就可以设置Cookie的路径,保存在访问AServlet时,也会包含BServlet中添加的Cookie。

     

    Cookie的SetPath设置cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie。

    首先默认情况如果不设置cookie的path,默认是 /项目名称/当前路径的上一层地址如:请求路径:/cookie_demo/servlet/login, cookie的路径:/cookie_demo/servlet

    如果我们设置path,如果当前访问的路径包含了cookie的路径(当前访问路径在cookie路径基础上要比cookie的范围小)cookie就会加载到request对象之中。

     

    代码示例:

    public class RegistServlet extends HttpServlet {
          
           @Override
           protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  doPost(req, resp);
           }
     
           public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  request.setCharacterEncoding("UTF-8");
                  //获取用户名和密码
                  String username = request.getParameter("username");
                  String password = request.getParameter("password");
                 
                  username = "likunpeng";
                  password = "123";
                 
                  System.out.println("用户名:"+username);
                  System.out.println("密码:"+password);
                 
                  //创建3个cookie对象,将用户名和密码连接存储,使用逗号分开
                  Cookie cookie = new Cookie("userpass", username+","+password);
                  Cookie cookie1 = new Cookie("userpass", username+"1,"+password);
                  Cookie cookie2 = new Cookie("userpass", username+"2,"+password);
                 
                  //设置cookie的存活时间
                  cookie.setMaxAge(60*10);
                  cookie1.setMaxAge(60*10);
                  cookie2.setMaxAge(60*10);
                 
                  //设置cookie的path路径
                  cookie.setPath("/cookie_demo3/");
                  cookie1.setPath("/cookie_demo3/a/");
                  cookie2.setPath("/cookie_demo3/a/b/");
                 
                  //把cookie写入浏览器
                  response.addCookie(cookie);
                  response.addCookie(cookie1);
                  response.addCookie(cookie2);
                 
                  response.getWriter().print("<h1>success</h1>");
           }
     
    }