【问题标题】:Jersey: Can I add a cookie in ContainerResponseFilter?Jersey:我可以在 ContainerResponseFilter 中添加 cookie 吗?
【发布时间】:2015-07-09 08:42:43
【问题描述】:

我有一个ContainerResponseFilter,我尝试在其中设置一个 cookie,如下所示:

@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
    String cookieName = "ExampleCookie";
    String cookieValue = "SomeData";
    logger.info("Setting cookie " + cookieName + " with value " + cookieValue + " into cookies " + JsonUtils.objectToJson(containerResponseContext.getCookies()));
    containerResponseContext.getCookies().put(cookieName, new NewCookie(cookieName, cookieValue));
}

但这会产生以下错误:

Caused by: java.lang.UnsupportedOperationException: null
    at java.util.AbstractMap.put(AbstractMap.java:203) ~[na:1.7.0_67]

这里不能设置cookie吗?如果是,我该怎么做?

【问题讨论】:

    标签: cookies jersey jax-rs servlet-filters


    【解决方案1】:

    是的,这似乎有点奇怪,这是不允许的。不知道为什么不允许这样做。我已经用 Jersey 和 Resteasy 进行了测试。使用 Resteasy,所发生的只是未设置 cookie(无异常)。我在想某些操作会将 cookie 设置为标头,当到达过滤器时,不会对 cookie 进行进一步的操作。

    我能想到的唯一解决方法就是自己设置标题

    responseContext.getHeaders().add("Set-Cookie", new NewCookie("Hello", "World"));
    

    NewCookietoString() 将返回它在标题中的外观

    Set-Cookie: Hello=World;Version=1
    

    【讨论】:

    • 非常感谢您的关注。我认为标题方法很简单。
    • 至于奇怪的是,REST 被设计为无状态的。 cookie 意味着状态。
    • @peeskillet 如果我们从浏览器发送一个新的 cookie。默认情况下网络服务器会将它们发送回浏览器吗?我正在用邮递员测试并观察它。
    • @peeskillet 实际上我是来自 responseContext 的传出 cookie。服务器没有从浏览器重定向 cookie ......但我在浏览器 cookie 中看到 cookie ......邮递员/浏览器也保存未发送的 cookie通过服务器而不是他们自己?
    • 只是为了整合这个正确答案,你也可以使用 HttpHeaders.SET_COOKIE 常量代替“Set-Cookie”文字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多