訪問WEB-INF下的JSP 頁(yè)面(轉(zhuǎn)載)

轉(zhuǎn)載一:

把那些限制訪問的資源(比如說jsp源代碼)放到Web應(yīng)用的WEB-INF目錄下,對(duì)于/web-INF/及其子目錄,不允許直接的公共訪問,所以就可以起到保護(hù)這些代碼未經(jīng)授權(quán)的訪問和窺視,更好的保護(hù)了源代碼(19頁(yè))。

這么書只是對(duì)這種方法進(jìn)行了簡(jiǎn)單的介紹,沒有描述詳細(xì)處理方法,我測(cè)試了一下,沒有辦法對(duì)放到/WEB-INF的文件進(jìn)行訪問,所以我就上網(wǎng)搜索了一下,才明白了具體的處理方法,感覺非常適合用在STRUTS結(jié)構(gòu)上的系統(tǒng)。下面請(qǐng)聽我詳細(xì)說明。

通常JSP開發(fā)人員會(huì)把他們的頁(yè)面文件存放在Web應(yīng)用相應(yīng)的子目錄下。一個(gè)典型的商店應(yīng)用程序的目錄結(jié)構(gòu)如圖2所示。跟catalog(商品目錄)相關(guān)的JSP被保存在catalog子目錄下。跟customer相關(guān)的JSP,跟訂單相關(guān)的JSP等都按照這種方法存放。

圖2.基于不同的功能JSP被放置在不同的目錄下

這種方法的問題是這些頁(yè)面文件容易被偷看到源代碼,或被直接調(diào)用。某些場(chǎng)合下這可能不是個(gè)大問題,可是在特定情形中卻可能構(gòu)成安全隱患。用戶可以繞過Struts的controller直接調(diào)用JSP同樣也是個(gè)問題。

為了減少風(fēng)險(xiǎn),可以把這些頁(yè)面文件移到WEB-INF目錄下。基于Servlet的聲明,WEB-INF不作為Web應(yīng)用的公共文檔樹的一部分。因此,WEB-INF目錄下的資源不是為客戶直接服務(wù)的。我們?nèi)匀豢梢允褂肳EB-INF目錄下的JSP頁(yè)面來提供視圖給客戶,客戶卻不能直接請(qǐng)求訪問JSP。

采用前面的例子,圖3顯示將JSP頁(yè)面移到WEB-INF目錄下后的目錄結(jié)構(gòu)

圖3. JSP存放在WEB-INF目錄下更為安全

如果把這些JSP頁(yè)面文件移到WEB-INF目錄下,在調(diào)用頁(yè)面的時(shí)候就必須把"WEB-INF"添加到URL中。

我們知道,實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn)有兩種方式,一種是通過redirect的方式,一種是通過forward的方式。redirect方式的跳轉(zhuǎn),系統(tǒng)會(huì)在一個(gè)新的頁(yè)面打開要跳轉(zhuǎn)的網(wǎng)頁(yè);而forward方式跳轉(zhuǎn),系統(tǒng)會(huì)在原來的頁(yè)面上打開一個(gè)要跳轉(zhuǎn)的網(wǎng)頁(yè)。所以放到WEB-INF目錄下的文件是不允許采用redirect方式的跳轉(zhuǎn)來訪問的,如下

例1:/test/test1.jsp文件

上面這段語(yǔ)句只有一個(gè)名為test的按鈕,如果單擊這個(gè)按鈕是,系統(tǒng)就會(huì)跳轉(zhuǎn)到/WEB-INF/jsp/test/test.jsp,它的代碼如下:

例2:/WEB-INF/jsp/test/test.jsp文件

跳轉(zhuǎn)成功!

事實(shí)上,這個(gè)跳轉(zhuǎn)是無法成功的,點(diǎn)擊按鈕后,IE會(huì)報(bào)“403 Forbidden”的錯(cuò)誤。

而forward方式的跳轉(zhuǎn)則可以成功,如下代碼:

例3:/test/test2.jsp文件

請(qǐng)注意上面紅色的語(yǔ)句,這段就是通過forward的形式來訪問/WEB-INF/jsp/test/test.jsp文件,在IE輸入地址http://localhost/test1/test2.jsp,網(wǎng)頁(yè)上就顯示“跳轉(zhuǎn)成功!”的信息了,這表示放到了WEB-INF可以通過forward的方式來訪問。

個(gè)人認(rèn)為,像這種方式的可能不大時(shí)候采用一般jsp進(jìn)行編程的系統(tǒng),因?yàn)楹芏囗?yè)面上都有采用submit這樣的方式來進(jìn)行跳轉(zhuǎn),但這種方式卻非常適合采用struts結(jié)構(gòu)的系統(tǒng)。因?yàn)椴捎眠@個(gè)結(jié)果大多是先跳轉(zhuǎn)到一個(gè)Action類,然后在Action類進(jìn)行相關(guān)處理后(比如說獲取相關(guān)的信息保存到session中,進(jìn)行有效性的判斷),然后再forward到另外一個(gè)頁(yè)面,這樣放到WEB-INF中的jsp代碼可以被正常訪問,也防止了對(duì)這些頁(yè)面的直接訪問,下面我來舉例說明。

下面我們先對(duì)配置文件struts-config.xml進(jìn)行配置,如下:

例4:WEB-INF/struts-config.xml文件

struts-config PUBLIC "-//Apache Software Foundation//DTD Struts

Configuration 1.1//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

type=" test.TestAction"

scope="request">

上面這個(gè)配置非常簡(jiǎn)單,請(qǐng)看紅色部分,這里定義了一個(gè)action類,它的路徑為/test,所對(duì)應(yīng)的類為test.TestAction.java,它都一個(gè)跳轉(zhuǎn)頁(yè)面,別名為test,對(duì)應(yīng)的頁(yè)面為/WEB-INF/jsp/test/test.jsp。

下面我們對(duì)例1的內(nèi)容進(jìn)行修改,使其跳轉(zhuǎn)到/test去。

例5:修改后的/test/test1.jsp文件

這樣我們?cè)贗E中訪問http://localhost/test/test1.jsp,然后點(diǎn)擊test按鈕,頁(yè)面就會(huì)跳轉(zhuǎn)到test.TestAction.java這個(gè)類來,下面是這個(gè)類的內(nèi)容。

package test;

import javax.servlet.http.*;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

public class TestAction extends Action

{

public ActionForward perform(ActionMapping mapping,

ActionForm form, HttpServletRequest req,

HttpServletResponse res)

{

return mapping.findForward("test");

}

}

可以看到,這個(gè)類是繼承Action類的,所有的控制類都必須繼承Action類,這個(gè)類里面有一個(gè)perform方法,跳轉(zhuǎn)到這個(gè)類都是從這個(gè)方法進(jìn)行訪問的(新版本可以是execute方法),現(xiàn)在這個(gè)方法里面只有一條語(yǔ)句,這句話的意思就是跳轉(zhuǎn)到一個(gè)別名為test的頁(yè)面,也就是/WEB-INF/jsp/test/test.jsp頁(yè)面,這樣我們點(diǎn)擊test按鈕后,IE就會(huì)顯示“跳轉(zhuǎn)成功!”這條信息,這表示系統(tǒng)允許這樣的跳轉(zhuǎn)。

轉(zhuǎn)載二:

因?yàn)閣eb-inf下,應(yīng)用服務(wù)器把它指為禁訪目錄,即直接在瀏覽器里是不能訪問到的.

但是可以讓servlet進(jìn)行訪問,如web-inf下有a.jsp則可以用request.getrequestdispatcher("/web-inf/a.jsp").forward(request,response);

補(bǔ)充一下,如果你想訪問web-inf下的htm文件的話,用request.getrequestdispatcher("/web-inf/a.htm").forward(request,response);是訪問不了的。

原因很簡(jiǎn)單,jsp就是servlet,會(huì)被編譯成class文件,而htm的就不行了。

所以需要配置以下conf下的web.xml文件才能去訪問htm。

具體實(shí)現(xiàn)如下:

用打開tomcat安裝目錄下conf下的web.xml文件,找到

jsp

*.jsp

然后在它下面添加

jsp

*.html

這樣的話,你就能用request.getrequestdispatcher("/web-inf/a.htm").forward(request,response);去訪問web-inf下的htm了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容