2013-03-23 108 views
2

我使用Spring框架在我的項目,Spring:不接受mvc下的POST請求:資源?如何解決

這裏是我的web.xml的一部分:

<servlet> 
    <servlet-name>SpringMvcServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/servlet-context.xml 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>SpringMvcServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
<filter> 
    <filter-name>httpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>httpMethodFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<error-page> 
    <error-code>404</error-code> 
    <location>/system/404.html</location> 
</error-page> 
<error-page> 
    <error-code>500</error-code> 
    <location>/system/500.html</location> 
</error-page> 

和配置:

<mvc:resources mapping="/system/**" location="/WEB-INF/pages/system/" /> 

不過,我覺得這麼多錯誤在我的日誌中,一些這樣的請求:

  • POST /index.php
  • POST /notexists.html

他們不是存在於我的服務器,所以會叫「/system/404.html」,但MVC:資源不接受POST方法,所以它會返回500錯誤。

如何解決這個問題?或者變通?

感謝

回答

1

首先:我覺得你濫用ResourceHttpRequestHandler當您嘗試使用POST請求。 - 我不確定如果你讓這個處理程序處理POST請求,所有的東西都能正常工作。


<mvc:resources />配置org.springframework.web.servlet.resource.ResourceHttpRequestHandler類的一個實例。這有超級類WebContentGenerator和這個超級類有一個屬性Set<String> supportedMethods

因此,所有你需要做的是:

<property name="supportedMethods"> 
    <list> 
     <value>GET</value> 
     <value>HEAD</value> 
     <value>POST</value> 
    </list> 
</property> 

不幸的是這需要你手工配置ResourceHttpRequestHandler,而不是使用<mvc:resources />

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="urlMap"> 
     <map> 
       <entry key="/system/**" value="myResourceHandler" /> 
     </map> 
    </property> 
    <property name="order" value="100000" />  
</bean> 

<bean id="myResourceHandler" name="myResourceHandler" 
     class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler"> 
     <property name="locations" value="/WEB-INF/pages/system/" /> 
     <property name="supportedMethods"> 
     <list> 
      <value>GET</value> 
      <value>HEAD</value> 
      <value>POST</value> 
     </list> 
    </property> 
    <!-- cacheSeconds: maybe you should set it to zero because of the posts--> 
</bean> 

我還沒有證明這種配置中,我剛剛從ResourceBeanDefintionParser做的事情中寫下來。

+0

謝謝,我會稍後再試。我不是使用「POST」,而是一些scaner或機器人POST這些請求,我只是認爲返回正常404更好,不會返回500錯誤。 – 2013-03-23 16:44:43

+0

太棒了,它的作品! – 2013-03-23 16:57:39