Я наткнулся на ошибку в своем веб-приложении, которая заставила меня почесать голову (и, в конце концов, потянув мои волосы) некоторое время, прежде чем я узнал, что происходит.Порядок выполнения сервлет-фильтров
В принципе, у меня было 2 фильтра, определенные в моей web.xml, а два отображения так:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>SpringFormMethodFilter</filter-name>
<url-pattern>/administration/*</url-pattern>
</filter-mapping>
Они оба фильтра Spring MVC. Моя проблема заключалась в том, что данные формы, которые я получил, не были интерпретированы как UTF-8, несмотря на то, что encodingFilter должен был установить кодировку запроса в UTF-8, прежде чем что-либо еще сможет ее прочитать.
я, наконец, заметил, что метод формы фильтр был выполнен перед фильтром кодирования, хотя порядок, в котором определены фильтре отображение должен быть порядком, в котором они прикованы:
порядок следования фильтры в цепочке совпадают с тем, что в дескрипторе развертывания веб-приложения отображаются сопоставления фильтра .
(от Oracle)
Когда я использовал то же отображение, т.е. отображение в сервлет вместо шаблона URL, для обоих отображений, порядок будет восстановлен и все работает как задумано:
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>SpringFormMethodFilter</filter-name>
<servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>
Является ли это частью спецификации Servlet
или это сбой Tomcat? Является ли это документированным где-нибудь, должен ли я представить отчет об ошибке?
Я использую Tomcat 7.0.39 с Java 7.
Спасибо, теперь все ясно. –