【问题标题】:Can servlet change cookie of another domainservlet 可以更改另一个域的 cookie
【发布时间】:2013-12-04 01:53:10
【问题描述】:

我需要更改另一个域的 cookies 值,我知道我们不能使用 javascript 来做到这一点。是否可以使用servlet?

我正在尝试这样但没有成功?我错了吗? 我在 localhost 的一个 tomcat 中部署了两个 Web 应用程序,即 Cookies1 和 Cookies2

cookie1 应用的Servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

//      String Html = "<HTML><BODY>HI</body></html>";
//      pw.write(Html);

        Cookie cookie  =  new Cookie("__utmz", "Arvind");
        cookie.setDomain("http://localhost:8080/Cookie2");
        cookie.setPath("/");

        response.addCookie(cookie);

        //response.getWriter().write(Html);
    }

cookie1 应用的Servlet

protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CookieSetDm.doGet()");
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(cookies[i].getName() + " <> "+ cookies[i].getValue());
            }
        }
    }

【问题讨论】:

    标签: java javascript tomcat servlets cookies


    【解决方案1】:

    出于安全原因,您不能使用托管在另一个域上的 servlet 或 JavaScript 修改一个域的 cookie。见RFC 6265, section 4.1.2.3

    除非域属性,否则用户代理将拒绝 cookie 指定包含源服务器的 cookie 的范围。 例如,用户代理将接受带有域的 cookie “example.com”或“foo.example.com”的属性来自 foo.example.com,但用户代理不会接受带有 “bar.example.com”或“baz.foo.example.com”的域属性。

    但您可以在 servlet/脚本中设置 cookie,然后在同一主机上的另一个 servlet/脚本中读取/修改 cookie。您can 甚至可以从运行在同一主机名/域的另一个端口上的服务器上读取或修改在同一主机名/域的一个端口上运行的服务器上设置的 cookie - 因此您可以让 Tomcat 在两个不同的端口上运行相同的服务器并在两者之间交换 cookie。


    请注意,您在第一个示例中错误地调用了 setDomain - cookie 的此字段采用域名而不是完整 URL。所以调用应该是这样的:

    cookie.setDomain("localhost");
    

    正如其他答案所指出的,某些浏览器会忽略 localhost 的 cookie,因此您可能根本不想设置 cookie 的此字段 - 这具有设置仅返回到同一主机的 cookie 的效果设置它(大部分时间是你想要的)。

    【讨论】:

    • +1 用于使用更新的 RFC。 6265 过时 2965 过时 2109。顺便说一句,“localhost”不是 cookie 的有效域(不以点开头并包含嵌入的点),一些浏览器可以并且会拒绝它。
    【解决方案2】:

    您只能在以相同内容结尾的两个域之间执行此操作;例如您可以将 cookie 的域设置为“.domain.com”,以便“x.domain.com”和“y.domain.com”都可以访问它。跨域 cookie 规则在RFC 2109 中描述。特别是:

    4.3.2 拒绝 Cookie

    为防止可能的安全或隐私侵犯,如果以下任何一种情况属实,用户代理将拒绝 cookie(不应存储其信息):

    • Path 属性的值不是请求 URI 的前缀。

    • Domain 属性的值不包含嵌入的点或 不以点开头。

    • 请求主机的值与域不匹配 属性。

    • 请求主机是 FQDN(不是 IP 地址),格式为 HD, 其中 D 是 Domain 属性的值,H 是一个字符串 包含一个或多个点。

    例子:

    • 来自请求主机 y.x.foo.com 的 Set-Cookie,用于 Domain=.foo.com 会被拒绝,因为 H 是 y.x 并且包含一个点。

    • 来自请求主机 x.foo.com 的 Set-Cookie,用于 Domain=.foo.com 将 被接受。

    • Domain=.com 或 Domain=.com. 的 Set-Cookie 将始终 被拒绝,因为没有嵌入点。

    • Domain=ajax.com 的 Set-Cookie 将被拒绝,因为 Domain 的值不以点开头。

    只要你不违反上述规则,你就没事。否则,浏览器将拒绝 cookie。

    值得注意的是,“localhost”不符合上述规则,一些浏览器可以并且确实拒绝带有“localhost”域的cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2011-07-14
      • 2010-11-11
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2011-06-22
      相关资源
      最近更新 更多