目录


Cookie 的路径

  1. Cookie 还有一个 path 属性,可以通过 Cookie#setPath(String) 方法来设置。你可以使用 HttpWatch 查看响应中的 Set-Cookie 中是否存在路径。下面是通过谷歌浏览器查看 Cookie 信息。
    会话 session 和 cookie(5)_Cookie 的路径_Cookie 的路径

  2. 也就是说,就算你不设置 Cookie 的 path,Cookie 也是有路径的。这个路径就是请求的路径。
    (1)例如在请求 ​​http://localhost/cookie_demo2/RegistServlet​​​ 时,服务器响应了一个 Cookie,那么这个 Cookie 的默认路径就是 /cookie_demo2/。
    (2)例如在请求 ​​http://localhost/cookie_demo2/servlet/Regist1Servlet​​​ 时,服务器响应了一个 Cookie,那么这个 Cookie 的默认路径就是 /cookie_demo2/servlet/。

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

  4. 那么 Cookie 的 path 是干什么的呢?假设你的浏览器当前已经有了两个 Cookie:
    (1)c1:name=id; value=test; path=/cookie_demo2/;
    (2)c2:name=wyx; value=welcome; path=/cookie_demo2/servlet/。
    (3)当访问 ​​http://localhost/cookie_demo2/*​​​ 时,请求头中会包含 c1,而不会包含 c2。
    (4)当访问 ​​http://localhost/cookie_demo2/servlet/*​​​ 时,请求头中会包含 c1 和 c2。
    (5)也就是说,在访问子路径时,会包含其父路径的 Cookie,而在访问父路径时,不包含子路径的 Cookie。
    会话 session 和 cookie(5)_Cookie 的路径_java_02

  5. 如果你想在 Regist1Servlet 中设置 Cookie,在客户端访问 RegistServlet 时也包含在请求头中,那么就需要设置 Regist1Servlet 中的 Cookie 的 path:
    (1)c2.setPath(“/cookie_demo2/”):硬编码;
    (2)c2.setPath(request.getContextpath() + “/”):活编码。
    (3)这样就可以设置 Cookie 的路径,保存在访问 RegistServlet 时,也会包含 Regist1Servlet 中添加的 Cookie。
    会话 session 和 cookie(5)_Cookie 的路径_Cookie 的路径_03
    访问 ​​http://localhost/cookie_demo3/servlet/RegistServlet?username=weiyuxuan&password=123456​​​会话 session 和 cookie(5)_Cookie 的路径_请求头_04

  6. Cookie 的 SetPath 设置 cookie 的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些 cookie。首先默认情况如果不设置 cookie 的 path,默认是 / 项目名称 / 当前路径的上一层地址

  • 如:请求路径:/cookie_demo/servlet/login; cookie 的路径:/cookie_demo/servlet
  1. 如果我们设置 path,如果当前访问的路径包含了 cookie 的路径(当前访问路径在 cookie 路径基础上要比 cookie 的范围小)cookie 就会加载到 request 对象之中。

  2. 以上操作完整源码
    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
    <servlet-name>RegistServlet</servlet-name>
    <servlet-class>com.wyx.cookie.RegistServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>RegistServlet</servlet-name>
    <url-pattern>/servlet/RegistServlet</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>CookiePathServlet</servlet-name>
    <servlet-class>com.wyx.cookie.CookiePathServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>CookiePathServlet</servlet-name>
    <url-pattern>/cookiePathTest</url-pattern>
    </servlet-mapping>

    </web-app>

    RegistServlet

    package com.wyx.cookie;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class RegistServlet extends HttpServlet
    {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
    {
    doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
    {
    req.setCharacterEncoding("UTF-8");

    String username = req.getParameter("username");
    String password = req.getParameter("password");

    System.out.println("用户名:" + username);
    System.out.println("密码:" + password);
    // 创建cookie对象
    Cookie cookie = new Cookie("userpass", username + "," + password);
    cookie.setMaxAge(60 * 60);
    cookie.setPath("/cookie_demo3/");
    resp.addCookie(cookie);

    // 创建cookie对象
    Cookie cookie1 = new Cookie("userpass1", username + "," + password);
    cookie1.setMaxAge(60 * 60);
    cookie1.setPath("/cookie_demo3/a/");
    resp.addCookie(cookie1);

    // 创建cookie对象
    Cookie cookie2 = new Cookie("userpass2", username + "," + password);
    cookie2.setMaxAge(60 * 60);
    cookie2.setPath("/cookie_demo3/a/b/");
    resp.addCookie(cookie2);
    resp.getWriter().print("success");
    }
    }

    CookiePathServlet

    package com.wyx.cookie;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class CookiePathServlet extends HttpServlet
    {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    }
    }

    工程文件下载

如有错误,欢迎指正!