j2ee核心模式筆記一——控制客戶端訪問服務器資源的方法

控制客戶端(一般爲瀏覽器)訪問服務器資源的方法
 
 
(方法1)如果只有少量的頁面需要控制,可以通過jsp標籤完成訪問檢查。
 
<% taglib uri="/WEB-INF/corej2eelib.tld" prefix="corePatterns" %>
<corePatterns:guard/>
 
<html>
..........
</html>
 
在這個標籤中,如果用戶沒有權限,可以直接forward到諸如"你沒有權限"之類的頁面
 
(方法2)以上的訪問控制還可以針對頁面中的部分代碼,這樣頁面可能就變成下面這個樣子
 
<% taglib uri="/WEB-INF/corej2eelib.tld" prefix="corePatterns" %>
 
不要保護的代碼
 
<corePatterns:guard>
 
要保護的代碼
 
</corePatterns:guard>
 
不要保護的代碼
 
這種情況可以有很多種變化,比如根據用戶的角色來決定是否需要保護,或者根據系統的某個狀態來顯示不同的內容,這些都可以通過傳入參數變量給標籤來完成。
 
以上兩種控制方法都是通過jsp的標籤來實現的,具體關於標籤的設置可以參考sun的j2ee教程14 15章,網址如下:http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html,還可以通過看tomcat裏自帶的一些標籤的例子來學習。
 
(方法3)通過一個簡單、通用的配置實現資源保護
 
如果你想限制客戶端訪問某些資源,比如jsp頁面,你可以把它放到web應用的/WEB-INF/目錄下即可,這樣,一個servlet控制器仍然能夠把請求轉發給該資源,而通過瀏覽器直接訪問URL就無法訪問到了。
 
(方法4)通過標準安全限制(或者web容器內置安全技術)來實現對資源的保護
 
servlet技術規定,對於URL的映射訪問,我們可以設定必須通過容器的安全角色控制,這裏我們以tomcat 5.0.28爲例:我們看tomcat的manager應用程序中(tomcat目錄/server/webapps/)中關於web.xml的配置
 
 <security-constraint>
    <web-resource-collection>
      <web-resource-name>HTMLManger and Manager command</web-resource-name>
      <url-pattern>/jmxproxy/*</url-pattern>
      <url-pattern>/html/*</url-pattern>
      <url-pattern>/list</url-pattern>
      <url-pattern>/sessions</url-pattern>
      <url-pattern>/start</url-pattern>
      <url-pattern>/stop</url-pattern>
      <url-pattern>/install</url-pattern>
      <url-pattern>/remove</url-pattern>
      <url-pattern>/deploy</url-pattern>
      <url-pattern>/undeploy</url-pattern>
      <url-pattern>/reload</url-pattern>
      <url-pattern>/save</url-pattern>
      <url-pattern>/serverinfo</url-pattern>
      <url-pattern>/status/*</url-pattern>
      <url-pattern>/roles</url-pattern>
      <url-pattern>/resources</url-pattern>
    </web-resource-collection>
    <auth-constraint>
       <!-- NOTE:  This role is not present in the default users file -->
       <role-name>manager</role-name>
    </auth-constraint>
  </security-constraint>
 
  <!-- Define the Login Configuration for this Application -->
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Tomcat Manager Application</realm-name>
  </login-config>
 
  上面的配置把對manager這個應用程序中需要保護的資源加上了角色控制,只有獲取該角色纔可以訪問這些URL,在manager.xml中,我們可以看到
 
 <ResourceLink name="users" global="UserDatabase"
                type="org.apache.catalina.UserDatabase"/>
 
這樣的一段配置,就表示manager這個應用程序引用了全局資源UserDatabase,在tomcat目錄/conf/server.xml的配置裏可以找到這樣的一段資源
 
<Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved">
    </Resource>
    <ResourceParams name="UserDatabase">
      <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
      </parameter>
      <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
      </parameter>
</ResourceParams>
 
現在清楚了,其實就是manager應用程序要用到tomcat目錄/conf/tomcat-users.xml裏的用戶,只有具備manager角色的用戶纔可以訪問限制資源的,tomcat-users.xml默認是沒有這樣的用戶的,我們加上兩行
 
<role rolename="manager"/>
<user username="manager" password="manager" roles="manager"/>
 
這樣重啓tomcat,我們就可以使用manager這個用戶訪問manager應用程序了。
 
 
除了以上講到的4種方法以外,控制客戶端訪問還要防止重複的表單提交(用戶通過刷新或回退重複,要防止這種情況)。
 
防止的原理是這樣的:在用戶進入表單頁面的時候生成一個隨機的數字,並賦值給一個session,並寫入一個隱藏控件在處理提交數據的頁面判斷傳入的隱藏控件的值是否等於session的值。
相等表明允許提交,否則不允許提交,其中最重要的一步是處理提交的數據成功後清空session,這樣他反覆提交過來的頁面,隱藏控件的值是存在的,而session爲空,就不允許提交了。
 
一般的web框架都會有處理重複提交的機制,比如struts,Struts中該方法的基本原理是:服務器端在處理到達的request之前,會將request中的Token值與保存在當前用戶session中的令牌值進行比較,看是否匹配。在處理完該 request後,且在response發送給客戶端之前,將會產生一個新的 Token,該Token除傳給客戶端以外,也會將用戶session中保存的舊的Token進行替換。這樣,如果用戶會退到剛纔的提交頁面並再次提交的話,客戶端傳過來的Token值和服務器端的不一致,從而有效地防止了重複提交的發生。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章