spring及びspring-mvcのバージョン3.1.0を使用した
tomcat6系にデプロイしたアプリで発生したのですが
spring-mvcってHTTPのOPTIONSメソッドを
上手くハンドリングできないような。。。
spring-mvcのバージョン3系では
@Controllerアノテーションを付けたクラスに
@RequestMappingアノテーションを付けて
リクエストとURLのマッピングを行います
@RequestMappingにはマッピングするURLの文字列だけでなく
ハンドリング対象のHTTPメソッドも指定できます。
@RequestMapping(value="/hoge",
method=RequestMethod.GET)
public String execGet() {
return "getDisplay"
}
@RequestMapping(value="/hoge",
method=RequestMethod.POST)
public String execPost() {
return "postDisplay"
}
@RequestMappingはクラスまたはメソッド単位で指定できるので
上記のように指定すると
同じ/hogeというURLに対してアクセスがあっても
GETメソッドの場合はexecGetが呼ばれ
POSTメソッドの場合はexecPostが呼ばれます。
今回発生した現象は
@RequestMappingアノテーションに
method=RequestMethod.OPTIONSを指定しても
指定の処理が呼ばれないというものでした。
URLのマッピングはそのままで
methodの設定をGETとかPOSTに変えて
該当メソッドでアクセスすると
意図した通りの処理が呼ばれていたので
URLのマッピングは問題ないようなのですが
method=RequestMethod.OPTIONSに変えて
OPTIONSメソッドで同じURLにアクセスしても
処理が何も呼ばれなくなってしまいました。。。
仕方ないので今回は
該当URLに対してFilterを作成し
該当URLへのアクセス毎にHTTPメソッドをチェックし
HTTP OPTIONSでアクセスがあった場合は
Filterからレスポンスを返すようにしました。
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if ("options".equalsIgnoreCase(req.getMethod())) {
HttpServletResponse res = (HttpServletResponse)response;
// レスポンスの設定と画面遷移
} else {
chain.doFilter(request, response);
}
}
一応、これで意図した通りの処理が実行されましたが
何か微妙な感じですねー
今回の要件ではOPTIONSメソッドでアクセスがあった場合は
特定のレスポンスヘッダを設定するだけでよかったのですが
何か業務ロジックの呼び出しとか必要な処理だと嫌な感じですね
この現象ってspring-mvcのバグなのか
あるいは単純にこちらの設定ミスなのか
tomcat6系にデプロイしたアプリで発生したのですが
spring-mvcってHTTPのOPTIONSメソッドを
上手くハンドリングできないような。。。
spring-mvcのバージョン3系では
@Controllerアノテーションを付けたクラスに
@RequestMappingアノテーションを付けて
リクエストとURLのマッピングを行います
@RequestMappingにはマッピングするURLの文字列だけでなく
ハンドリング対象のHTTPメソッドも指定できます。
@RequestMapping(value="/hoge",
method=RequestMethod.GET)
public String execGet() {
return "getDisplay"
}
@RequestMapping(value="/hoge",
method=RequestMethod.POST)
public String execPost() {
return "postDisplay"
}
@RequestMappingはクラスまたはメソッド単位で指定できるので
上記のように指定すると
同じ/hogeというURLに対してアクセスがあっても
GETメソッドの場合はexecGetが呼ばれ
POSTメソッドの場合はexecPostが呼ばれます。
今回発生した現象は
@RequestMappingアノテーションに
method=RequestMethod.OPTIONSを指定しても
指定の処理が呼ばれないというものでした。
URLのマッピングはそのままで
methodの設定をGETとかPOSTに変えて
該当メソッドでアクセスすると
意図した通りの処理が呼ばれていたので
URLのマッピングは問題ないようなのですが
method=RequestMethod.OPTIONSに変えて
OPTIONSメソッドで同じURLにアクセスしても
処理が何も呼ばれなくなってしまいました。。。
仕方ないので今回は
該当URLに対してFilterを作成し
該当URLへのアクセス毎にHTTPメソッドをチェックし
HTTP OPTIONSでアクセスがあった場合は
Filterからレスポンスを返すようにしました。
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if ("options".equalsIgnoreCase(req.getMethod())) {
HttpServletResponse res = (HttpServletResponse)response;
// レスポンスの設定と画面遷移
} else {
chain.doFilter(request, response);
}
}
一応、これで意図した通りの処理が実行されましたが
何か微妙な感じですねー
今回の要件ではOPTIONSメソッドでアクセスがあった場合は
特定のレスポンスヘッダを設定するだけでよかったのですが
何か業務ロジックの呼び出しとか必要な処理だと嫌な感じですね
この現象ってspring-mvcのバグなのか
あるいは単純にこちらの設定ミスなのか