2011-03-02 19 views
3

これは些細な質問のように聞こえるが、何とか私はそれを理解できないようだ。Spring MVC 2.5アプリケーションでHTTP OPTIONSリクエストのレスポンスを変更するにはどうすればよいですか?

私はSpring MVCアプリケーションを持っています。私は、GETとPOST以外のHTTPメソッドはサポートしていません。しかし、OPTIONSが自分のアプリケーションに送信された要求

<property name="supportedMethods" value="GET,POST"/> 

許可さすべて HTTPメソッドを示してレスポンスを返す:私はすべての私のコントローラの豆で、次のセットがあります。

GETメソッドとPOSTメソッドだけを表示するようにOPTIONS応答を変更するにはどうすればよいですか?私はdoOptionsメソッドをオーバーライドしてサーブレットでこれを行うことができますが、Spring MVCアプリケーションについてはわかりません。 DispatcherServletを延長し、doOptionsを上書きする必要がありますか?

このアプリケーションでは、SimpleFormControllerベースのコントローラとxmlベースの設定でSpring mvc 2.5.6を使用しています。

+0

私は春をしていないので、ここにリンクのコメントがあります:http://forum.springsource.org/showthread.php?t=53472これを制御する方法をいくつか示しています。それは便利であるかもしれません。 – BalusC

+0

リンクありがとう、BalusC。そこに記述されているシナリオは、少し異なる(コントローララップサーブレットと純粋なコントローラ)がありますが、OPTIONS要求はデフォルトでアプリケーションに送られず、DispatcherServlet自体によって処理されるという疑いがあります。だから今私の質問になります:OPTIONSがコントローラに(リンクで示唆された設定変更ごとに)行った場合、どのように応答で405とは対照的に、(GET、POST)で200を返すようにしますか?リンク内のポスターはDispatcherServletを拡張し、そこにあるものをオーバーライドする必要がありました。それは私がやらなければならないと思うことです。 – samitgaur

答えて

1

を使用する場合があります。 WebContentGeneratorは、スプリング2.xコントローラの基本クラスです。コントローラを構築している間は必ず確実にこのメソッドを呼び出すだけです。また、入力パラメータとして文字列varargs(サポートされるメソッド)を受け取るWebContentGeneratorのコンストラクタを使用することもできます。

FrameworkServletクラスのdoOptionsメソッドはsuper.doOptions(request, response);HttpServletクラスを呼び出します。このメソッドの出力に含まは、サーブレットで宣言されたメソッドに基づいて、このようなものされています

​​

のDispatcherServletクラス(とその基底クラスFrameworkServlet)は、これらすべてのメソッドを宣言:doPutdoDeletedoGetdoPostなど、doOptionsの出力はあなたが望むものではありません。唯一の方法は、DispatcherServletをサブクラス化することだと思います。

+0

これは、xml configを通じてsupportedMethodsという名前のプロパティを設定すると、私がすでにやっていることです。サポートされているメソッドをGETとPOSTだけに設定しています。これにより、コントローラは残りのメソッド(OPTIONSを除く)をサポートしなくなります。ただし、コントローラのOPTIONS要求の出力は変更されません。それでも、すべてのメソッドが有効になっていることを示す応答が送信されます。それが私が解決策を見出そうとしているところです。 – samitgaur

+0

さて、私はあなたの質問を理解しています、ごめんなさい。私は私の答えを更新しました...しかし、あなたはDispatcherServletをサブクラス化すべきだと思います。 – javanna

+0

@Samit G.こんにちは、私の更新された答えをお読みください?それは役に立ちますか? – javanna

2

警告:私はOPTIONSメッセージを処理していません。

リクエストハンドラ(@Controllerで注釈付き)では、RequestMethod.OPTIONSを使用してオプションリクエストを処理できます。たとえば、私はあなたが入力パラメータとしてサポートされているメソッドを含む文字列の配列を受け取りWebContentGenerator#setSupportedMethodsを呼び出すことができると思い

... stuff ... 
    @RequestMapping(RequestMethod.OPTIONS) 
    public String processOptions() 
    { 
    ... stuff ... 
    }
+0

返事をありがとう。しかし、アプリケーションでは、SimpleFormControllerベースのコントローラとxmlベースの設定でSpring mvc 2.5.6を使用しています。申し訳ありませんが、私はこの問題について言及しませんでした。 – samitgaur

1

これはちょっと古いと知っていますが、この質問に関する追加情報を見つけたので、今後他の人に役立つことを願っています。

@RequestMapping(RequestMethod.OPTIONS)アプローチは、すぐにDispatcherServletを使用してすぐには機能しません。そのスーパークラスであるFrameworkServletは、スーパークラスHttpServletに最初に委任しているため、サーブレットをスキャンしてdoXXXメソッドを実装し、それに応じてAllowヘッダーを設定します。

if (this.dispatchOptionsRequest) { 
    processRequest(request, response); 
} 

trueにdispatchOptionsRequest値を設定するために使用することができますsetDispatchOptionsRequest(ブール値)がある。しかし、それは、これらのラインを持っているsuper.doOptions(...)の呼び出し、次の。その後、DispatcherServletはOPTIONS要求を適切に注釈を付けたメソッドに渡します。

これは、OPTIONS要求が現在のユーザーの承認に基づいて異なる値を返すことを可能にするために必要でした。だから、DispatcherServletをサブクラス化し、デフォルトのコンストラクタでそのパラメータを設定することによって、私は最終的にHTTP OPTIONS要求のためのコントローラで呼び出しを受信し、それを自分で処理することができました。

もう1つ、コントローラのメソッドで、HttpServletResponse型のパラメータを宣言でき、Springがインスタンスを手渡します。いったんreset()を呼び出してAllowヘッダーをパージし、必要に応じて自分自身をロールすることができます。

(Note:@RequestMapping(RequestMethod.TRACE)で注釈を付けられたコントローラメソッドにこれらのリクエストを渡す予定の場合、httpトレースサポート用のFrameworkServletにはsetDispatchTraceRequestを使用する同様のパターンがあります)。

関連する問題