这听起来像一个琐碎的问题,但我似乎无法弄清楚。
我有一个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)声明了所有这些方法:
doPut
,doDelete
,doGet
,doPost
等,因此doOptions
的输出不是您想要的。我认为唯一的方法是子类化DispatcherServlet。