2013-08-20 6 views
8

Jersey Responseフィルタを作成しています。私はJersey 1.17を使用しています。私はフィルタAPIのhttpServletRequestのいくつかの属性にアクセスしたいです。私が今やっていることは、以下の通りです。以下のスニペットのようにservletRequestを注入するのは安全ですか?これによって並行処理の問題が発生しますか?複数の要求が同時に送信された場合、異なる要求のservletRequestは互いに上書きしますか?あなたのhlepに感謝します。@Context Jersey ContainerResponseFilterのHttpServletRequestスコープ

public class LoggingFilter implements ContainerResponseFilter { 
@Context private HttpServletRequest servletRequest; 
@Override 
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) { 
String s = this.servletRequest.getAttribute("xxx"); 
.... 
} 
} 

答えて

6

(最新の、5.1以前)JAX-RS specification状態の同時実行セクション9.1:

コンテキストが特異的であるCのライフサイクルでの特定の要求が、特定の JAX-RSコンポーネント(プロバイダとリソースクラスのインスタンスに他の 要求ごとに)複数の同時の要求をサポートする必要があります。 第9.2節にリストアップされているタイプの1つのインスタンスを注入する場合、指定されたインスタンスは、特定の要求の正しいコンテキストを で選択できる必要があります。スレッドローカルプロキシの使用は、 の一般的な方法です。

したがって、仕様に従って、コンテキストが安全であることを保証するために、JAX-RS実装(例えばジャージー)が必要です。あなたがしていることを続けてください。

も参照してください。Extract request attributes from container request of Jersey

+1

ありがとうございました。人々が私の質問にすばやく答えるとは思っていませんでした。これは本当に私を驚かせ、問題を解決しました。 – lorcel

6

あなたは安全です。 HttpServletRequest/HttpServletResponseを注入するときは、特定のインスタンスを処理するのではなく、ThreadLocalオブジェクトに格納されている実際のインスタンスで呼び出しを呼び出すプロキシを使用します。各リクエストは、独自のスレッドに処理され、独自のスレッドにアクセスします。HttpServletRequest/HttpServletResponseHttpServletRequest/HttpServletResponseのほかに、ThreadLocal<HttpServletRequest>/ThreadLocal<HttpServletResponse>を注入し、 '#get() `メソッドを使用して、プロキシの真のリクエスト/レスポンスインスタンスを取得することもできます。

+0

ありがとうございます。実際、私は人々が私の質問にすばやく答えるとは思っていませんでした。これは本当に私を驚かせ、問題を解決しました。 – lorcel

関連する問題