[英]Adding cookie to all responses in Jersey / JAX-RS (Scala)
Thought this would be a common use case but I'm coming up short. 以为这将是一个常见的用例,但我要简短了。 Also, I'm using Scala but a Java answer would be fine, too.
另外,我正在使用Scala,但Java回答也可以。
In Jersey I'd like to set a simple cookie on all responses coming out of my app. 在泽西岛,我想对我的应用程序发出的所有响应设置一个简单的Cookie。
A quick google shows that I can set cookies on a single response by performing the following: 快速谷歌显示我可以通过执行以下操作在单个响应上设置cookie:
return Response.ok(new Viewable("/index", model)) .cookie(new NewCookie("name", "Hello, world!")) .build();
That's great if I just want to set a cookie on a per-response basis, but I want it on every response. 如果我只想按每个响应设置一个cookie,那很好,但是我希望每个响应都设置它。 This seems like a job for middleware.
这似乎是中间件的工作。 The Jersey Docs recommend this for setting up middleware:
Jersey Docs建议使用此方法来设置中间件:
class MyResponseMiddleware ContainerResponseFilter {
override def filter(req: ContainerRequestContext, res: ContainerResponseContext) = {
// do stuff here
}
}
The problem is there's no way to set a cookie on the ContainerResponseContext
as .getCookies
returns a read-only map, unlike .getHeaders()
which is mutable. 问题是没有办法在
ContainerResponseContext
上设置cookie,因为.getCookies
返回只读映射,这与可变的.getHeaders()
不同。
I also tried to create a cookie by setting the headers: 我还尝试通过设置标题来创建cookie:
containerResponseContext.getHeaders().add(HttpHeaders.SET_COOKIE, new NewCookie(...))
but this did not make it to the browser. containerResponseContext.getHeaders().add(HttpHeaders.SET_COOKIE, new NewCookie(...))
但这并没有出现在浏览器中。
It seems like if I could get a reference to ServletResponse
or HttpServletResponse
this would be simple but that doesn't appear to be possible in Jersey's middleware (filters). 似乎如果我能获得对
ServletResponse
或HttpServletResponse
的引用,这将很简单,但在Jersey的中间件(过滤器)中似乎不可能实现。
This seems like a pretty straightforward use-case so I feel like I'm missing something obvious. 这似乎是一个非常简单的用例,所以我觉得我缺少明显的东西。
You can simply Inject HttpServletResponse into the filter. 您可以简单地将HttpServletResponse注入到过滤器中。 Use @Context annotation as follows.
使用@Context注释,如下所示。
@Provider
public class ResponseHTTPStatusFilter implements ContainerResponseFilter{
@Context HttpServletResponse resp;
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
resp.addCookie(cookie);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.