- 註冊時間
- 2006-3-13
- 最後登錄
- 2025-1-10
- 在線時間
- 673 小時
- 閱讀權限
- 200
- 積分
- 417
- 帖子
- 1107
- 精華
- 0
- UID
- 2
  
|
參考來源 http://www.hrpstudio.net/2010/04/11/struts2-interceptor-jsp.html
struts2 的核心就是攔截器。 假如現在有一些 jsp 頁面(包括 login.jsp, register.jsp, welcome.jsp 以及一些瀏覽的頁面)這些瀏覽的頁面如果是沒有登錄的用戶瀏覽,則直接顯示,如果登錄了則還在相應處要顯示用戶的相關信息,這個怎麼可以實現? 這是這幾天困擾著我的問題。我找遍整個互聯網,得出的結論是:不能! struts 根本就不能攔截 jsp 頁面或者是 servlet。
看一下 struts 的文檔就可以知道,struts 默認讓我們攔截 /*,也就是說也就是說攔截所有請求(包括.jsp)。但是,這裡的攔截說的是,請求交給 struts2 處理。問題是,如果是 struts 聲明的後綴(如: .action),那麼 struts2 處理。 如果不是 struts2 聲明的後綴(如: .jsp),那麼 struts2 放行!
struts2 的後綴聲明,struts.xml 中:- <constant name="struts.action.extension" value="action,do" />
複製代碼 這裡聲明了 .action 和 .do 為 struts2 的後綴,如果你想攔截 .jsp,那麼你的所有 .jsp,struts2 都認為是 Action! 這樣非常麻煩。
所以解決方案是,自己寫個 Filter(實現 Filter 接口),然後在 web.xml 上面配置攔截你想攔截的 .jsp 訪問。
要記得,我們寫的 filter,在 web.xml 上配置的時候,要寫在 struts 之前,像下面這樣:- <filter-mapping>
- <filter-name>DelegatingFilterProxy</filter-name> //這是我實現的filter
- <url-pattern>/index.jsp</url-pattern> //我只想攔截index.jsp,如果想攔截所有.jsp,寫成這樣就行了:/*.jsp
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url -pattern>
- </filter-mapping>
複製代碼 回到一開始提出的問題,我們經常會遇到這樣的情況:一個顧客登陸我們的網站,他只會在地址欄裡輸入:www.example.com,我猜沒有誰會特地去記住 www.example.com/index.action 這樣的網址吧。
於是我們的首頁 index.jsp 必須承擔起這樣一個任務:如果顧客是新來的,就顯示一個默認的首頁就好了;如果顧客是註冊了的用戶,而且選擇了“記住我”或者“兩週內不用登陸”之類的 cookie,那麼就應該為其自動登錄,然後在 index.jsp 相應的用戶登錄的區塊顯示用戶信息。
但是問題來了,我們不能在 jsp 上面操作 cookie,操作 session,寫數據庫查詢語句,這樣違背了 MVC 的原則。
但是在 struts 的框架下,又沒有提供攔截 jsp 的功能(struts 只關心它的 action)。
所以我們想攔截 jsp,還是得寫 filter,在 filter 里為用戶登錄。
其實,struts 提供了一種規範,就是說,把所有的 jsp 文件放在 WEB-INF 文件夾裡,jsp 只是用作 view,那樣,通過 http 就不能直接訪問 jsp,只能通過 action 去訪問,struts 控制 action就容易得多了,不過還是得讓顧客去輸入 index.action 之類的域名,我現在看到 action 幾個字都想吐了。
struts 雖然好用(其實也不是那麼好用,經常會與 spring,hibernate 發生包衝突,當初我配置 struts + spring + hibernate 環境時,被它們害慘了,現在配好了,我都不敢動它們了),總覺得它在誤導我們。不過又離不開它,人生就是糾結。 |
|