Spring MVC does not handle RequestMethod.OPTIONS
http-options-method, spring, spring-mvc, tomcat7
Solution
For default Spring DispatcherServlet supports GET, HEAD, POST, PUT, PATCH and DELETE only; if you want to support TRACE and OPTIONS you have to put "dispatchOptionsRequest" and "dispatchTraceRequest" properties to "true"; check here docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api
In order to support OPTIONS too in your web.xml you have to put this:
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
By adding it I can handle OPTIONS:
~$ curl -i -X OPTIONS http://localhost:8180/sample/api/test
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Access-Control-Allow-Headers: origin, content-type, accept, x-requested-with
Access-Control-Max-Age: 60
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: *
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Content-Length: 0
Date: Wed, 16 Apr 2014 08:44:55 GMT
Angelo
Problem
I am in the context of a Rest API. As I am performing cross domain request, I need to send back the header "Access-Control-Allow-Origin". I have a controller such: ``` @Controller @RequestMapping("/api") public class PackageManagerRestController { @RequestMapping(method = RequestMethod.OPTIONS, value = "/test") public void commonOptions(HttpServletResponse theHttpServletResponse) throws IOException { theHttpServletResponse.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept, x-requested-with"); theHttpServletResponse.addHeader("Access-Control-Max-Age", "60"); // seconds to cache preflight request --> less OPTIONS traffic theHttpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); theHttpServletResponse.addHeader("Access-Control-Allow-Origin", "*"); } @RequestMapping(method = RequestMethod.GET, value = "/test") public void getPtions(HttpServletResponse theHttpServletResponse) throws IOException { theHttpServletResponse.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept, x-requested-with"); theHttpServletResponse.addHeader("Access-Control-Max-Age", "60"); // seconds to cache preflight request --> less OPTIONS traffic theHttpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); theHttpServletResponse.addHeader("Access-Control-Allow-Origin", "*"); } } ``` If I run a test with GET, the result is as expected: ``` $ curl -i -X GET http://localhost:8081/api/test HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Access-Control-Allow-Headers: origin, content-type, accept, x-requested-with Access-Control-Max-Age: 60 Access-Control-Allow-Methods: GET, POST, OPTIONS Access-Control-Allow-Origin: * Content-Length: 0 Date: Wed, 16 Apr 2014 08:18:38 GMT ``` However, if I send the request with OPTIONS, the controller never handles the request: ``` $ curl -i -X OPTIONS http://localhost:8081/api/test HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH Content-Length: 0 Date: Wed, 16 Apr 2014 08:19:56 GMT ``` Anyone has any clue of why I am receiving this "default response" and why I cannot customize it ?