我需要更改另一个域的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());
}
}
}
答案 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。