在struts2中實現去掉字尾及url重寫

一隻小螞蟻吆發表於2020-04-06
寫道
首先,這要用到兩個軟體包,一個是SmartUrls(Struts2的外掛,下載地址:http://code.google.com/p/smarturls-s2/downloads/list),還有就是urlrewritefilter(下載地址:http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.6.zip).
要想去掉struts2的字尾,就要這樣配置filter:

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.texturemedia.smarturls.SmartURLsFilter</filter-class>

</filter>
用這個代替struts2的核心過濾器,FilterDispatcher。不必擔心struts2不起作用了,因為這個過濾器是繼承自FilterDispatcher的。同時在struts.properties中加入struts.action.extension= ,不設任何值。


然後就是配置UrlRewriteFilter,如下

<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
在配置filter-mapping的時候,注意urlrewritefilter的應該在前面。然後urlrewritefilter的重寫該怎麼用大家可以參看文件,這裡就不再贅述。

當使用時發現重寫後,filterChain上只有一個urlrewritefilter,而沒有經過smartUrls就發到了請求的資源,得到的自然是一個404錯誤。於是我參看urlrewritefilter的原始碼發現,如果重寫url成功的話,將會呼叫RequestDispatcher的forward方法轉發到資源,而重寫不成功或者是沒有重寫才會呼叫filterChain.dofilter。所以struts2的filter-mapping應該這樣配置

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
然後就 OK 了
最後說明一點,這要在支援servlet2.4以上規範的容器中才氣作用,因為servlet2.3規範裡面,過濾器只支援request過濾,不支援轉發之類的過濾
但是在struts2.1.8以上的版本,均可以通過配置struts.xml文件來實現去掉字尾名。
<constant name="struts.action.extension" value="" />
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>/*</url-pattern>
 </filter-mapping>


 

相關文章