简体   繁体   English

将Cookie添加到Jersey / JAX-RS(Scala)中的所有响应中

[英]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). 似乎如果我能获得对ServletResponseHttpServletResponse的引用,这将很简单,但在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM