bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Java struts2 如何攔截 jsp 頁面?
查看: 5693|回復: 0
go

struts2 如何攔截 jsp 頁面? [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2011-3-23 17:00 |只看該作者 |倒序瀏覽 |打印
參考來源 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 中:
  1. <constant name="struts.action.extension" value="action,do" />
複製代碼
這裡聲明了 .action 和 .do 為 struts2 的後綴,如果你想攔截 .jsp,那麼你的所有 .jsp,struts2 都認為是 Action! 這樣非常麻煩。

所以解決方案是,自己寫個 Filter(實現 Filter 接口),然後在 web.xml 上面配置攔截你想攔截的 .jsp 訪問。
要記得,我們​​寫的 filter,在 web.xml 上配置的時候,要寫在 struts 之前,像下面這樣:
  1. <filter-mapping>
  2.   <filter-name>DelegatingFilterProxy</filter-name>  //這是我實現的filter
  3.   <url-pattern>/index.jsp</url-pattern>  //我只想攔截index.jsp,如果想攔截所有.jsp,寫成這樣就行了:/*.jsp
  4. </filter-mapping>

  5. <filter-mapping>
  6.   <filter-name>struts2</filter-name>
  7.     <url-pattern>/*</url -pattern>
  8. </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 環境時,被它們害慘了,現在配好了,我都不敢動它們了),總覺得它在誤導我們。不過又離不開它,人生就是糾結。
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-4-26 19:00 , Processed in 0.070872 second(s), 18 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.