2016-10-26 4 views
1

これは一般的な使用例ですが、私は近づいてきています。また、私はScalaを使っていますが、Javaの答えもうまくいくはずです。Jersey/JAX-RS(Scala)のすべてのレスポンスにクッキーを追加する

ジャージーでは、アプリから出てくるすべてのレスポンスに簡単なクッキーを設定したいと思います。

簡単にGoogleは、私が実行することにより、単一の応答にクッキーを設定することができることを示し、以下:

私はちょうどごとの応答単位でクッキーを設定したい場合は素晴らしいことだ

return Response.ok(new Viewable("/index", model)) .cookie(new NewCookie("name", "Hello, world!")) .build();

が、私すべての反応にそれが欲しい。これはミドルウェアの仕事のようです。ミドルウェアを設定するためのJersey Docs recommend this

class MyResponseMiddleware ContainerResponseFilter { 
    override def filter(req: ContainerRequestContext, res: ContainerResponseContext) = { 
    // do stuff here 
    } 
} 

問題は変更可能で.getHeaders()とは異なり、読み取り専用のマップを返します.getCookiesとしてContainerResponseContextにクッキーを設定する方法はありませんです。

は、私はまた、ヘッダを設定することにより、クッキーを作成しようとしました:

containerResponseContext.getHeaders().add(HttpHeaders.SET_COOKIE, new NewCookie(...))が、これはブラウザにそれをしませんでした。

ServletResponseまたはHttpServletResponseへの参照が得られるようであれば、これはbe simpleになりますが、Jerseyのミドルウェア(フィルタ)では可能ではないようです。

これはかなり単純なユースケースのように思えるので、わかりやすいものが欠けているように感じます。

+0

フィルタが呼び出されていることを確認しましたか? –

+0

http://stackoverflow.com/questions/29954305/jersey-can-i-add-a-cookie-in-containerresponsefilter? – Rich

答えて

0

あなたは単にHttpServletResponseをフィルターに注入することができます。 次のように@Contextアノテーションを使用します。

@Provider 
public class ResponseHTTPStatusFilter implements ContainerResponseFilter{ 
@Context HttpServletResponse resp; 
    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     resp.addCookie(cookie); 
    } 

} 
関連する問題