Я использую в своем проекте фреймворк Spring,

Вот часть моего 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
  • ЗАПИСЬ /notexists.html

Их не было на моем сервере, поэтому будет вызывать "/system/404.html", но mvc: resources не принимают метод POST, поэтому он вернет ошибку 500.

Как это исправить? или работать?

Благодарность

2
Felix Chang 23 Мар 2013 в 18:40

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.

2
Felix Chang 23 Мар 2013 в 21:00
Спасибо, попробую позже. Я не использую POST, но некоторые сканеры или роботы отправляют эти запросы, я просто думаю, что лучше вернуть нормальный 404, а не вернуть ошибку 500.
 – 
Felix Chang
23 Мар 2013 в 20:44