[英]Adding cookie to all responses in Jersey / JAX-RS (Scala)
以为这将是一个常见的用例,但我要简短了。 另外,我正在使用Scala,但Java回答也可以。
在泽西岛,我想对我的应用程序发出的所有响应设置一个简单的Cookie。
快速谷歌显示我可以通过执行以下操作在单个响应上设置cookie:
return Response.ok(new Viewable("/index", model)) .cookie(new NewCookie("name", "Hello, world!")) .build();
如果我只想按每个响应设置一个cookie,那很好,但是我希望每个响应都设置它。 这似乎是中间件的工作。 Jersey Docs建议使用此方法来设置中间件:
class MyResponseMiddleware ContainerResponseFilter {
override def filter(req: ContainerRequestContext, res: ContainerResponseContext) = {
// do stuff here
}
}
问题是没有办法在ContainerResponseContext
上设置cookie,因为.getCookies
返回只读映射,这与可变的.getHeaders()
不同。
我还尝试通过设置标题来创建cookie:
containerResponseContext.getHeaders().add(HttpHeaders.SET_COOKIE, new NewCookie(...))
但这并没有出现在浏览器中。
似乎如果我能获得对ServletResponse
或HttpServletResponse
的引用,这将很简单,但在Jersey的中间件(过滤器)中似乎不可能实现。
这似乎是一个非常简单的用例,所以我觉得我缺少明显的东西。
您可以简单地将HttpServletResponse注入到过滤器中。 使用@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.