servlet可以更改另一个域的cookie

时间:2013-11-20 07:18:31

标签: java javascript tomcat servlets cookies

我需要更改另一个域的cookie值,我知道我们不能使用javascript来实现它。是否可以使用servlet?

我这样想但没有成功?我错了吗? 我有两个web应用程序namly Cookies1和Cookies2部署在localhost中的一个tomcat

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());
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

出于安全原因,您无法使用托管在其他域上的servlet或JavaScript修改一个域的Cookie。见RFC 6265, section 4.1.2.3

  

除非Domain属性,否则用户代理将拒绝cookie   指定包含源服务器的cookie的范围。   例如,用户代理将接受带有域的cookie   属性&#34; example.com&#34;或者&#34; foo.example.com&#34;从   foo.example.com,但用户代理不接受带有的cookie   &#34; bar.example.com&#34;的域属性或者&#34; baz.foo.example.com&#34;。

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


请注意,您在第一个示例中未正确调用setDomain - Cookie的此字段采用域名而非完整网址。所以电话应该是这样的:

cookie.setDomain("localhost");

正如其他答案所述,某些浏览器会忽略localhost的Cookie,因此您可能根本不想设置Cookie的这个字段 - 这会产生一个cookie,只会返回给设置它的主机(大部分时间都是你想要的)。

答案 1 :(得分:2)

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

  

4.3.2拒绝Cookies

     

为防止可能的安全或隐私侵犯,如果满足以下任何条件,则用户代理拒绝cookie(不得存储其信息):

     
      
  • Path属性的值不是request-URI的前缀。

  •   
  • “域”属性的值不包含嵌入的点或    不是以点开头。

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

  •   
  • 请求主机是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将被拒绝,因为    域的值不以点开头。

  •   

只要你没有违反上述规则,你就可以了。否则,浏览器将拒绝cookie。

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