程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制

用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制

編輯:關於JSP

          控制客戶端訪問是開發一個基於B/S的架構的系統的開發者必須考慮的問題。jsp或SERVLET規范的基於配置文件的安全策略對資源的控制是以文件為單位的,即只可以定義某個視圖全部可以或全部不能被訪問。一個比較復雜的系統往往要要求對視圖的一部分(如JSP頁面裡的一個按鈕)提供訪問控制,只允許被某種角色的用戶訪問。如果采用可編程的安全策略,因為對用戶角色和操作的定義在開發時不能定義,而且這種策略加大了程序員的工作量,它可能不是一種好的辦法。

           我采用定制標簽庫和和配置文件來解決這個問題:把要權限控制的JSP頁面元素如BUTTON,作為標簽的內容。為受保護的內容起一個唯一的名稱,把這個名稱作為標簽的一個屬性。某個角色對某個頁面元素或一組頁面元素是否有權限,在xml配置文件中描述。

     

           例如,下面的JSP頁面有“詳細”和“修改”兩個按鈕。

    <%@ taglib uri="http://mytag" PRefix="custTag" %>

    <html>

    <head>

    <title>test</title>

    </head>

    <body >

    <form name="form1" >

       <table width="600" border="0" cellspacing="0" cellpadding="2" >

          <tr>

           <td>

                <custTag:JspSecurity elementName="employeedetail" >

                  <input type="button" name="detail"  value="詳細" >

                </custTag:JspSecurity>

                <custTag:JspSecurity elementName="employeemodify" >

                  <input type="button" name="modify"  value="修改" >

                </custTag:JspSecurity>

            </td>

          </tr>

    </table>

    <br>

    </form>

    </body>

     

           下面XML配置文件內容表示對角色為common的用戶,只對名為employeedetail 的頁面元素即“詳細”按鈕有權限,對角色為“admin”的用戶,對名為employeedetail 和employeemodify的頁面元素即兩個按鈕都有權限。

    <?xml version="1.0" encoding="GB2312"?>

    <security>

    <htmlElement name="employeedetail" >

    <roleName name="common" />

    <roleName name="admin" />

    </htmlElement>

    <htmlElement name="employeemodify" >

    <roleName name="admin" />

    </htmlElement>

    </security>

     

           定制標簽類JspSecurityTag繼承了BodyTagSupport類。BodyTagSupport有一個變量bodyContent指向起始標志和結束標志之間的內容。JspSecurityTag的私有靜態變量roleList保存從XML文件中取到角色和頁面元素的對應集合,私有變量ElementName對應頁面元素的名稱。當解析該定制標簽時,首先先取到頁面元素的名稱,再取到當前用戶的角色,如果角色有該頁面元素的權限,就顯示標簽正文(即頁面元素),否則不顯示。

     

    Pagekage com.presentation.viewhelper.JspSecurityTag;

     

    import javax.servlet.jsp.tagext.*;

    import javax.servlet.jsp.*;

    import java.util.*;

    import org.xml.sax.*;

    import org.xml.sax.helpers.*;

    import org.w3c.dom.*;

    import java.io.*;

    import javax.xml.parsers.*;

     

    public class JspSecurityTag extends BodyTagSupport {

      //保存從XML文件中取到角色和頁面元素的對應集合

      private static ArrayList roleList;

      //頁面元素的名稱

      private String elementName;

     

      public void setElementName(String str)

      {

        this.elementName=str;

      }

     

      public int doAfterBody() throws JspException{

        if(roleList==null)

        {

          roleList=getList();

        }

        try{

            //如果認證通過就顯示標簽正文,否則跳過標簽正文,就這麼簡單

            if(isAuthentificated(elementName))

            {

              if(bodyContent != null){

                JspWriter out=bodyContent.getEnclosingWriter();

                bodyContent.writeOut(out);

              }else

              {

              }

            }

        }catch(Exception e){

          throw new JspException();

        }

        return SKip_BODY;

      }

      //從XML配置文件中取到角色和頁面元素的對應,保存到靜態的ArrayList

      private ArrayList getList()

      {

        DocumentBuilderFactory dbf =

            DocumentBuilderFactory.newInstance();

        DocumentBuilder db = null;

        Document doc=null;

        NodeList childlist = null;

        String elementName;

        String roleName;

        int index;

        ArrayList theList = new ArrayList();

     

        try{

          db = dbf.newDocumentBuilder();

        }catch(Exception e)

        {

          e.printStackTrace();

        }

        try{

          doc = db.parse(new File("security.xml"));

        }catch(Exception e)

        {

          e.printStackTrace();

        }

        //讀取頁面元素列表

        NodeList elementList = doc.getElementsByTagName("htmlElement");

        for(int i=0;i<elementList.getLength();i++)

        {

          Element name = ((Element)elementList.item(i));

          //頁面元素的名稱

          elementName = name.getAttribute("name");

          //該頁面元素對應的有權限的角色的列表

          NodeList rolNodeList = ((NodeList)name.getElementsByTagName("roleName"));

          for(int j=0;j<rolNodeList.getLength();j++)

          {

            //有權限的角色的名稱

            //roleName = ((Element)rolNodeList.item(j)).getNodeValue();

            roleName = ((Element)rolNodeList.item(j)).getAttribute("name");

            theList.add(new ElementAndRole(elementName,roleName));

          }

        }

        return theList;

      }

     

      //檢查該角色是否有該頁面元素的權限

      private boolean isAuthentificated(String elementName)

      {

    String roleName = "";

    //在用戶登陸時把該用戶的角色保存到session中,這裡只是直接從SESSION中取用//戶角色。

    roleName=this.pageContext.getSession().getAttribute("rolename”);

    // roleList包含elementName屬性為elementName,roleName屬性為roleName的//ElementAndRole對象,則該角色有該頁面元素的權限

         if(roleList.contains(new ElementAndRole(elementName,roleName)))

              {

                   return true;

              }

        }

        return  false;

      }

      //表示角色和頁面元素的對應的關系的內部類

      class ElementAndRole{

        String elementName;

        String roleName;

        public ElementAndRole(String elementName,String roleName)

        {

          this.elementName=elementName;

          this.roleName=roleName;

        }

        public boolean equals(Object obj)

        {

          return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

        }

      }

    }

    在標簽庫能被JSP頁面使用前,要做以下三個步驟

    1、  在JSP頁面中包括一個taglib元素,確定需要加載到內存的標簽庫。前面的JSP文件的第一行:<%@ taglib uri="http://mytag" prefix="custTag" %>做的就是這件事。

    2、  在配置文件web.xml中使用taglib元素確定TLD文件的位置。在web.xml中增加:

      <taglib>

        <taglib-uri>http://mytag</taglib-uri>

        <taglib-location>

           /WEB-INF/mytag.tld

        </taglib-location>

      </taglib>

    3、TLD文件必須使用taglib元素標識每個定制標簽極其屬性。

    下面是使用這個標簽庫對應的TLD文件

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

    <!DOCTYPE taglib

     PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

     "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

    <taglib>

      <tlibversion>1.0</tlibversion>

      <jspversion>1.1</jspversion>

      <shortname>myTag</shortname>

      <uri/>

      <tag>

        <name>JspSecurity</name>

        <tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>

        <info>

           JspSecurityTag

        </info>

        <attribute>

           <name>elementName</name>

           <required>true</required>

           <rtexprvalue>true</rtexprvalue>

        </attribute>

      </tag>

    </taglib>

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved