web-inf下jsp之間的跳轉
今天就先寫一個WEB開發的小心得吧。
在我做的SSH專案,有大量的jsp頁面,在開始做專案的時候,我就只會機械的學別人在struts裡面配頁面之間的跳轉路徑,雖然後來知道了struts的原理,瞭解了跳轉的過程,但是真正自己要用到非struts環境底下的頁面跳轉的時候發現經常跳轉報錯,無論我是用相對路徑還是絕對路徑都報錯,這就搞的我很鬱悶了,這究竟是為什麼呢?
原來這是JSP的安全性作的鬼。
在J2EE中其主要安全性就體現在web工作目錄的WEB-INF資料夾下.如果將一個頁面儲存在WEB-INF檔案下 ,那麼該頁面則不能被使用者訪問,就好比小偷都看不見我有什麼,他還能知道要偷什麼嗎.. 因此如果將一個頁面放在WEB-INF資料夾下,那麼該頁面的安全性將得到提高... 但有時候當我們需要訪問該頁面時,卻無法訪問,如何能夠訪問WEB-INF資料夾下的頁面呢?
struts為此提供了很便捷的跳轉環境。在struts中每一個跳轉都是通過一個action來處理的,action處理完了之後在forward到相對地址就行,這個很簡單。
但是問題是如果我不通過action來處理跳轉,我想直接從web-inf的a.jsp頁面跳到b.jsp頁面怎麼辦呢?通常這個時候我們會試下相對地址/b.jsp 絕對地址/WEB-INF/b.jsp或者<%=request.getContext()=%>/WEB-INF/b.jsp,但無論怎麼搞都不行,這個時候就比較崩潰。想直接跳轉從安全性的角度來看肯定不行的,因為在WEB-INF底下web容器是不讓你看見他的跳轉路徑的。直接跳轉不行,間接跳轉還是有的,比如struts的action跳轉就是一種間接,為什麼間接就是安全的呢?因為它的跳轉地址是在web.xml裡面配好的,訪問的人是看不見的所以是間接安全的。難道只有struts可以完成間接的任務,顯然不是了。其實想一想struts的action是什麼東西就知道怎麼做了,struts的action說白了還是一個servlet,所以可以通過servlet來完成任務了。
首先在web.xml裡面配置servlet和servlet mapping
<servlet>
<servlet-name>goto</servlet-name>
<jsp-file>/WEB-INF/jsp/test.jsp</jsp-file>--要跳轉到的頁面
</servlet>
<servlet-mapping>
<servlet-name>goto</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
配置好了之後在jsp頁面裡用a就可以跳轉了<a href="/工程名/test">測試頁面跳轉</a>--這裡一定要“/工程名/test”
通過servlet跳轉還是比較麻煩了,但是這樣能保證JSP頁面的安全性,想兩全其美是比較難的了。
當然如果安全要求不高,那就可以做成很簡單的了,直接把所有的jsp頁面全部放在webRoot底下,在WebRoot下頁面使用者可以直接輸入地址訪問。