泽西岛:我可以在ContainerResponseFilter中添加一个cookie吗?

时间:2015-04-29 20:52:21

标签: cookies jersey jax-rs servlet-filters

我有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是不可能的?如果是的话,我该怎么做?

1 个答案:

答案 0 :(得分:17)

是的,这似乎有点奇怪,这是不允许的。不知道为什么不允许这样做。我用Jersey和Resteasy进行了测试。使用Resteasy,所有发生的事情都是没有设置cookie(没有例外)。我想某些操作会将cookie设置为标题,到达过滤器时,不会对cookie进行进一步操作。

我能想到的唯一工作就是自己设置标题

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

toString()的{​​{1}}将返回它在标题中的显示方式

NewCookie