分類  >  Web前端 >

jsp放在web-inf停,原因

tags:    時間:2013-12-09 23:44:26
jsp放在web-inf下,原因

jsp放在web-inf下,原因主要有兩個 

1. 遠古時代的模式會把業務邏輯,資料庫連接等敏感信息寫在jsp裡面,被用戶直接訪問會有安全問題。 
現代模式里這個不再成為問題,不應該成為問題。 

2. jsp是在伺服器端運行的,而且通常都需要其他程序支持——比如後台處理好數據再讓jsp渲染等,用戶直接訪問一則沒有意義,二則會拋異常,這些都浪費伺服器資源。 



其次,如果你一定要放在web-inf下。 
需要弄個servlet來forward,或者讀取文件后寫在response上。 

如果是spring,可以參考 
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html 

 

 

 

 

 

本人在看《J2EE核心模式》(「Core J2ee Patterns」,劉天北、熊節譯),裡面提到了一種實現資源保護的方法,那就是把那些限制訪問的資源(比如說jsp源代碼)放到Web應用的WEB-INF目錄下,對於/web-INF/及其子目錄,不允許直接的公共訪問,所以就可以起到保護這些代碼未經授權的訪問和窺視,更好的保護了源代碼(19頁)。

      這麼書只是對這種方法進行了簡單的介紹,沒有描述詳細處理方法,我測試了一下,沒有辦法對放到/WEB-INF的文件進行訪問,所以我就上網搜索了一下,才明白了具體的處理方法,感覺非常適合用在STRUTS結構上的系統。下面請聽我詳細說明。

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

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

這種方法的問題是這些頁面文件容易被偷看到源代碼,或被直接調用。某些場合下這可能不是個大問題,可是在特定情形中卻可能構成安全隱患。用戶可以繞過Strutscontroller直接調用JSP同樣也是個問題。

為了減少風險,可以把這些頁面文件移到WEB-INF 目錄下。基於Servlet的聲明,WEB-INF不作為Web應用的公共文檔樹的一部分。因此,WEB-INF 目錄下的資源不是為客戶直接服務的。我們仍然可以使用WEB-INF目錄下的JSP頁面來提供視圖給客戶,客戶卻不能直接請求訪問JSP

採用前面的例子,圖3顯示將JSP頁面移到WEB-INF 目錄下后的目錄結構

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

    如果把這些JSP頁面文件移到WEB-INF 目錄下,在調用頁面的時候就必須把"WEB-INF"添加到URL中。

    我們知道,實現頁面的跳轉有兩種方式,一種是通過redirect的方式,一種是通過forward的方式。redirect方式的跳轉,系統會在一個新的頁面打開要跳轉的網頁;而forward方式跳轉,系統會在原來的頁面上打開一個要跳轉的網頁。所以放到WEB-INF目錄下的文件是不允許採用redirect方式的跳轉來訪問的,如下

1/test/test1.jsp文件

<html>

<body>

    <form name="testform" action="/WEB-INF/jsp/test/test.jsp">

      <input type = "submit" value="test">

    </form>

</body>

</html>

    上面這段語句只有一個名為test的按鈕,如果單擊這個按鈕是,系統就會跳轉到/WEB-INF/jsp/test/test.jsp,它的代碼如下:

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

<html>

<body>

跳轉成功!

</body>

</html>

事實上,這個跳轉是無法成功的,點擊按鈕后,IE會報「403 Forbidden」的錯誤。

forward方式的跳轉則可以成功,如下代碼:

3/test/test2.jsp文件

<html>

<body>

<form name="testform">

<jsp:forward page = "/WEB-INF/jsp/test/test.jsp" />

</form>

</body>

</html>

    請注意上面紅色的語句,這段就是通過forward的形式來訪問/WEB-INF/jsp/test/test.jsp文件,在IE輸入地址http://localhost/test1/test2.jsp,網頁上就顯示「跳轉成功!」的信息了,這表示放到了WEB-INF可以通過forward的方式來訪問。

    個人認為,像這種方式的可能不大時候採用一般jsp進行編程的系統,因為很多頁面上都有採用submit這樣的方式來進行跳轉,但這種方式卻非常適合採用struts結構的系統。因為採用這個結果大多是先跳轉到一個Action類,然後在Action類進行相關處理后(比如說獲取相關的信息保存到session中,進行有效性的判斷),然後再forward到另外一個頁面,這樣放到WEB-INF中的jsp代碼可以被正常訪問,也防止了對這些頁面的直接訪問,下面我來舉例說明。

    下面我們先對配置文件struts-config.xml進行配置,如下:

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

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

<!-- ========== Action Mapping Definitions ============================== -->

<action-mappings>

<action path="/test"

            type=" test.TestAction"

            scope="request">

            <forward name="test" path="/WEB-INF/jsp/test/test.jsp"/>

    </action>

</action-mappings>

</struts-config>

    上面這個配置非常簡單,請看紅色部分,這裡定義了一個action類,它的路徑為/test,所對應的類為test.TestAction.java,它都一個跳轉頁面,別名為test,對應的頁面為/WEB-INF/jsp/test/test.jsp

    下面我們對例1的內容進行修改,使其跳轉到/test去。

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

<html>

<body>

    <form name="testform" action="/test">

      <input type = "submit" value="test">

    </form>

</body>

</html>

    這樣我們在IE中訪問http://localhost/test/test1.jsp,然後點擊test按鈕,頁面就會跳轉到test.TestAction.java這個類來,下面是這個類的內容。

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");

    }

}

    可以看到,這個類是繼承Action類的,所有的控制類都必須繼承Action類,這個類裡面有一個perform方法,跳轉到這個類都是從這個方法進行訪問的(新版本可以是execute方法),現在這個方法裡面只有一條語句,這句話的意思就是跳轉到一個別名為test的頁面,也就是/WEB-INF/jsp/test/test.jsp頁面,這樣我們點擊test按鈕后,IE就會顯示「跳轉成功!」這條信息,這表示系統允許這樣的跳轉。

注意:CSS文件要存放在根目錄,此時引用要用絕對路徑!!!引用格式如:/項目名/css文件夾/*.css

來自:http://blog.sina.com.cn/s/blog_4baadb1f01009fin.html

================jsp訪問WEB-INF下面的資源=============

 

 

方法1
本來WEB-INF中的jsp就是無法通過地址欄訪問的.所以安全.如果說你要訪問這個文件夾中的jsp文件需要在項目的web.xml文件中去配置servlet格式差不多的配置就ok了.

如下:
<servlet>
         <servlet-name>runtain</servlet-name>
         <jsp-file>/WEB-INF/INF.jsp</jsp-file>
</servlet>
<servlet-mapping>
         <servlet-name>runtain</servlet-name>
         <url-pattern>/XXX</url-pattern>

訪問地址:http://localhost:8080/runtain/xxx
就可以看見內容了.!
方法2.<jsp:forward page = "/WEB-INF/jsp/test/test.jsp" />
方法3:request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request, response);
 

怎麼樣讓servlet訪問web-inf下的網頁或jsp文件呢.因為web-inf下,應用伺服器把它指為禁訪目錄,即直接在瀏覽器里是不能訪問到的.
因些,可以讓servlet進行訪問,如web-inf下有a.jsp則可以用request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request,response);進行派遣訪問.但如果web-inf下有a.htm,則用request.getRequestDispatcher("/WEB-INF/a.htm").forward(request,response);就不能訪問.

一開始想不通,覺得怪.後來想想,jsp其實也是servlet,會自動編譯的,於是work目錄下會有/web-inf/a$jsp.class類型,於是有頭緒了,讓應用伺服器能夠編譯.htm,如a$htm.class.抱有這個想法,開始動手

在tomcat下的conf/web,找到jsp的訪問方式,

<servlet-mapping>
     <servlet-name>jsp</servlet-name>
     <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>

於是在下面添加

<servlet-mapping>
     <servlet-name>jsp</servlet-name>
     <url-pattern>*.htm</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
     <servlet-name>jsp</servlet-name>
     <url-pattern>*.html</url-pattern>
   </servlet-mapping>

結果:一切OK,訪問a.htm,和a.html在work/web-inf/下者有a$htm.class,a$html.class生成

推薦閱讀文章

Bookmark the permalink ,來源:互聯網