[英]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.