【发布时间】:2014-10-24 02:10:55
【问题描述】:
问题
我在使用 REST 应用程序 (RESTEasy) 时遇到了问题。在我的应用程序中,我正在设置一个 cookie。当我使用 Firefox 开发和测试它时,我没有遇到任何问题。 cookie 将按预期设置并返回。但是,当我在 Internet Explorer 中尝试时,cookie 不会被设置。我在 Chrome 中确认了相同的行为。
我使用 Fiddler 验证了无论是什么浏览器发出请求,cookie 都会被发回。但是,尽管浏览器收到了 cookie,但 IE 和 Chrome 不仅没有发回 cookie,而且我在浏览器的 cookie 存储中也找不到 cookie 的踪迹。
我的尝试
这是今天上班的时候,我花了很长时间关闭 IE 中的所有安全设置。我不认为是这样。回到家后,我编写了一个简化版本,以尽可能多地排除代码复杂性。我还在 Safari 中对其进行了测试,并在 Chrome 和 IE 上再次对其进行了测试。因此,现在已经在 Windows 和 Mac 上进行了测试。没有运气。
我也尝试过修改 cookie 的设置。我最初设置了 HttpOnly,所以我取消了它。我最初有一个会话 cookie,所以我将其有效期更改为 1 天。我试图愚弄路径和域。没有运气。
应用程序更复杂,但在简化方面我排除了跨站点问题、Ajax 问题等。我还尝试过使用不同的域:localhost、Intranet 和完全限定域。不知道怎么回事!
这里是返回的 cookie 标头的示例。 (这来自 curl 和我的精简版应用程序。)在这个版本中,cookie 设置为 1 天后过期。但是,就像我说的,我也尝试过使用会话 cookie。
Set-Cookie: ExampleCookie=abcdefg0123456; Version=1; Comment="Just a sample cookie."; Domain=localhost; Max-Age=86400; Expires=Sun, 31-Aug-2014 03:33:44 GMT; Path=/
示例代码(已测试)
下面是我失败的代码的精简版本。我已经测试了下面的代码,我无法理解为什么 Chrome 和 Internet Explorer 不会设置 cookie,但 Firefox 和 Safari 会。是否有人对这些浏览器和 cookie 或 RESTEasy 和 cookie 有问题?
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
// Omitted: The base path, set elsewhere, is /CookieExample/rest
@Path("/")
public class CookieExampleService {
@GET
@Path("/")
@Produces("text/html")
public Response sayHello() {
return Response.ok().entity("<p>Hello, Cookies!</p>").build();
}
@GET
@Path("/cookiejar")
@Produces("text/html")
public Response serveCookie() {
NewCookie cookie = new NewCookie("ExampleCookie",
"abcdefg0123456",
"/",
"localhost",
"Just a sample cookie.",
NewCookie.DEFAULT_MAX_AGE,
false);
// http://localhost:8080/CookieExample/rest/cookiejar
return Response.ok().cookie(cookie).entity("<p>Have a cookie!</p>").build();
}
}
任何见解将不胜感激。这真的让我很难过。谢谢!
【问题讨论】:
标签: java internet-explorer google-chrome cookies resteasy