2012-03-01 11 views
23

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

+2

、このフォローアップの質問が役に立つことがあります。http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik

答えて

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

} 

あなたは私が初心者のためのBozhoの答えにいくつかの詳細を追加してそのdispatchOptionsRequesttrue

+0

実際には、DispatcherServletが要求をインターセプトして処理するため、それは機能しません。代わりにDispatcherServletを設定する必要があります。私はこの問題で多大な苦痛を負っていましたが、現在私はこの問題を部分的に解決しました。私はコミュニティのための私のソリューションを投稿したいと思ったが...私は100以上の評判を持っているのでstackoverflow私は自分自身の質問に答えるために私が8時間を待つように強制する。 – MaVVamaldo

+0

アップデートを追加しました – Bozho

+1

はい、解決策です。私はあなたの前に会っていたはずです、良い神! XD しかし、DispatcherServletはコントローラを委任する前に「何らかの作業」を行うため、これは「部分的」な解決策です。実際には、「許可」ヘッダーに触れていなくても、「許可されたメソッド」のリストでいっぱいになります。私の場合、それは問題ではありませんが、それは他の誰かのためだと思います。 – MaVVamaldo

30

を設定することでのDispatcherServletを設定する必要があります。 AJAX呼び出しを提供するために、正しい "Access-Control-Allow- *"ヘッダーを設定するなど、Spring ControllerにOPTIONS要求を管理させることが便利な場合があります。あなたは一般的な方法

@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が応答に許可されたメソッドのリストを追加することを知っています。私の場合、これは重要ではなかったし、私はその事を行かせた。多分、さらなる試験が必要になるかもしれません。

+1

ただし、ハンドラメソッドがエンドポイント "/ x/y"に登録されている場合、これは機能しません。今では/ xへのOPTIONS要求は動作しますが、/ x/yには作用しません この問題を解決するオプションはありますか?このOPTIONS処理を登録されたすべてのエンドポイントに追加することを意味しますか?私は傍受者について考えますが、それ以外の方法はありますか? – wrm

8

上記の2つの回答を簡単に補足すると、サーブレット3(web.xmlなし)環境でdispatchOptionsRequestを有効にして、上記の回答をnon-xmlセットアップ。

spring 3.2/servlet 3環境では、web.xmlと同等のJavaであるDispatcherServlet初期化子クラスがいくつかあります。私の場合はAbstractAnnotationConfigDispatcherServletInitializerです。次のコードを追加すると、dispatchOptionsRequestを可能にします:

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

私は、次のアプローチを取った:Mavenの(or manually)を使用して

は、この依存で引っ張っ:

<dependency> 
    <groupId>com.thetransactioncompany</groupId> 
    <artifactId>cors-filter</artifactId> 
    <version>1.3.2</version> 
</dependency> 

をこれがすべてキャプチャする実装を持っていますインバウンドOPTIONS要求。 web.xmlファイルに次の設定を追加してください:

私が/ **アプローチで見た問題は、より具体的なコントローラの実装がこれをオーバーライドします。

0

web.xmlファイルのないSpringでは、Paul Adamsonの回答に基づいて、Optionsメソッド呼び出しを処理するために、パラメータdispatchOptionsRequesttrueにディスパッチャに設定しました。春ブーツ上の方のため

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

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

dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/*"); 
関連する問題