首先,修改成:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
是可以的。
引起此錯誤的原因如下:
這個對filter的基礎知識的理解:容器只認 全名匹配,路徑匹配,擴展名匹配.
/*.action 又是路徑匹配,有時擴展名匹配. 容器沒辦法區分
解決方法:寫*.action
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
如果改為這樣的話,如果某些頁面使用了struts2的標簽的話,運行時是會報錯,說是<url-pattern>*.action</url-pattern>配置的不對,那么采用以下某網友提供的方法:
由於你使用標簽的時候訪問的是*.jsp頁面,訪問的時候用到標簽也要使用到struts2的包,所以你的web.xml文件里面的配置要這個樣子
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts3</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts3</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
就是把*.jsp的請求也用struts2攔截掉,這樣就不會出錯了。這個問題不是標簽問題,是struts2攔截器到底攔截什么請求的問題,