web-dev-qa-db-ja.com

Spring MVCでHTTP OPTIONSを処理する方法は?

Spring MVCを使用してOPTIONSリクエストをコントローラーでインターセプトしたいのですが、DispatcherServletによってキャッチされます。どうすれば管理できますか?

28
MaVVamaldo
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {

}

dispatchOptionsRequesttrueに設定して、dispatcherServletを設定する必要があります

12
Bozho

初心者向けに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は許可されたメソッドのリストを応答に追加します。私の場合、これは重要ではありませんでした。たぶんさらなる検査が必要です。

33
MaVVamaldo

上記の2つの回答の簡単な補足として、サーブレット3(web.xmlなし)環境でdispatchOptionsRequestを有効にする方法を次に示します。非XML設定で上記の回答を適用する方法を理解するのにしばらく時間がかかりました。

Spring 3.2 /サーブレット3環境では、さまざまなDispatcherServlet初期化クラスがあり、これはJava web.xmlと同等です。私の場合はAbstractAnnotationConfigDispatcherServletInitializer。次のコードを追加すると、dispatchOptionsRequestが有効になります。

    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setInitParameter("dispatchOptionsRequest", "true");
    }
8
Paul Adamson

私は次のアプローチをとりました:

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>

/ **アプローチで見た問題は、より具体的なControllerの実装がこれをオーバーライドすることです。

3
Jim

Web.xmlファイルのないSpringの場合、Paul Adamsonの回答に基づいて、dispatchOptionsRequesttrueにディスパッチャに設定し、Optionsメソッド呼び出しを処理します。

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new        DispatcherServlet(applicationContext));

dispatcher.setInitParameter("dispatchOptionsRequest", "true");                

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
0
Daniel De León