一尘不染

servlet可以更改另一个域的cookie

tomcat

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

我正在尝试这样但没有成功?我做错了吗?我在本地主机的一个tomcat中部署了两个Web应用程序Namly 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());
            }
        }
    }

阅读 300

收藏
2020-06-16

共1个答案

一尘不染

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

用户代理将拒绝cookie,除非Domain属性为cookie的范围指定一个范围,该范围将包括原始服务器。例如,用户代理将接受来自foo.example.com的Domain属性为“
example.com”或“ foo.example.com”的cookie,但是用户代理将不接受Domain属性为的cookie。 “
bar.example.com”或“ baz.foo.example.com”。

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


请注意,setDomain在第一个示例中,您的调用不正确-Cookie的此字段使用域名而不是完整的URL。因此,调用应如下所示:

cookie.setDomain("localhost");

正如其他答案所指出的那样,某些浏览器会忽略的cookie localhost,因此您可能根本不想设置cookie的此字段-
这样做的结果是设置了一个cookie,该cookie只返回给设置该cookie的同一主机(大多数时间是您想要的)。

2020-06-16