Spring MVC を使用してコントローラーで OPTIONS リクエストをインターセプトしたいのですが、DispatcherServlet によってキャッチされます。どうすればそれを管理できますか?
5 に答える
初心者向けのBozhoの回答にさらに詳細を追加しました。Spring Controller に OPTIONS リクエストを管理させると便利な場合があります (たとえば、AJAX 呼び出しを処理するために正しい「Access-Control-Allow-*」ヘッダーを設定するなど)。ただし、一般的な方法を試してみると
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.OPTIONS, value="/**")
public void manageOptions(HttpServletResponse response)
{
//do things
}
}
DispatcherServlet がクライアントの OPTIONS リクエストをインターセプトするため、これは機能しません。
回避策は非常に簡単です。
次のように、web.xml ファイルから DispatcherServlet を構成する必要があります。
...
<servlet>
<servlet-name>yourServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
「dispatchOptionsRequest」パラメーターを追加し、true に設定します。
これで、DispatcherServlet は OPTIONS 処理をコントローラーに委譲し、manageOption() メソッドが実行されます。
お役に立てれば。
PS。正直なところ、DispatcherServlet が許可されたメソッドのリストを応答に追加していることがわかります。私の場合、これは重要ではなかったので、手放しました。さらなる検査が必要かもしれません。
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
に設定して、dispatcherServletを構成する必要がありdispatchOptionsRequestますtrue
上記の2つの回答の簡単な補足として、xml以外のセットアップで上記の回答を適用する方法を理解するのに時間がかかったので、サーブレット3(web.xmlなし)環境でdispatchOptionsRequestを有効にする方法を次に示します。
Spring 3.2 / サーブレット 3 環境で DispatcherServletは、web.xml に相当する Java であるさまざまな初期化クラスがあります。私の場合、それはAbstractAnnotationConfigDispatcherServletInitializerです。次のコードを追加すると、dispatchOptionsRequest が有効になります。
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("dispatchOptionsRequest", "true");
}
私は次のアプローチを取りました。
Maven を使用して (または手動で)、この依存関係を取り込みます。
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>1.3.2</version>
</dependency>
これには、すべてのインバウンド OPTIONS リクエストをキャプチャする実装があります。web.xml ファイルに次の構成を追加します。
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Content-Type,Accept,Origin</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/** アプローチで私が見た問題は、より具体的なコントローラーの実装がこれをオーバーライドすることです。