这听起来像一个琐碎的问题,但我似乎无法弄清楚。

我有一个Spring MVC应用程序。除GET和POST外,我不支持任何http方法。我所有的控制器bean中都有以下设置:

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

但是,发送到我的应用程序的OPTIONS请求会发回一个响应,该响应显示允许的所有http方法。

如何更改OPTIONS响应以仅显示允许的GET和POST方法?我知道我可以通过重写doOptions方法在servlet中执行此操作,但是我不确定Spring MVC应用程序如何。我是否需要扩展DispatcherServlet并覆盖doOptions

该应用程序使用带有基于SimpleFormController的控制器和基于xml的配置的Spring mvc 2.5.6。

最佳答案

我认为您可以调用WebContentGenerator#setSupportedMethods,它接收包含支持方法的字符串数组作为输入参数。 WebContentGenerator是spring 2.x控制器的基类,因此您只需要在构造控制器(肯定会对其进行扩展)的过程中调用此方法即可。您还可以使用WebContentGenerator的构造方法,该方法接收字符串varargs(支持的方法)作为输入参数。

不幸的是,doOptions类中的FrameworkServlet方法调用super.doOptions(request, response);类的HttpServlet。此方法的输出基于Servlet中已声明的方法,如下所示:

Method[] methods = getAllDeclaredMethods(this.getClass());

for (int i = 0; i < methods.length; i++) {
    Method m = methods[i];

    if (m.getName().equals("doGet")) {
        ALLOW_GET = true;
        ALLOW_HEAD = true;
    }
    if (m.getName().equals("doPost"))
        ALLOW_POST = true;
    if (m.getName().equals("doPut"))
        ALLOW_PUT = true;
    if (m.getName().equals("doDelete"))
        ALLOW_DELETE = true;
}

DispatcherServlet类(及其基类FrameworkServlet)声明了所有这些方法:doPutdoDeletedoGetdoPost等,因此doOptions的输出不是您想要的。我认为唯一的方法是子类化DispatcherServlet。

07-24 22:15