熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

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

2013-11-15 12:15:51  來源: 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="form" >

  <table width="" border="" cellspacing="" cellpadding="" >

  <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="" encoding="GB"?>

  <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 compresentationviewhelperJspSecurityTag;

  

  import javaxservletjsptagext*;

  import javaxservletjsp*;

  import javautil*;

  import orgxmlsax*;

  import orgxmlsaxhelpers*;

  import orgwcdom*;

  import javaio*;

  import javaxxmlparsers*;

  

  public class JspSecurityTag extends BodyTagSupport {

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

  private static ArrayList roleList;

  //頁面元素的名稱

  private String elementName;

  

  public void setElementName(String str)

  {

  thiselementName=str;

  }

  

  public int doAfterBody() throws JspException{

  if(roleList==null)

  {

  roleList=getList();

  }

  try{

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

  if(isAuthentificated(elementName))

  {

  if(bodyContent != null){

  JspWriter out=bodyContentgetEnclosingWriter();

  bodyContentwriteOut(out);

  }else

  {

  }

  }

  }catch(Exception e){

  throw new JspException();

  }

  return SKip_BODY;

  }

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

  private ArrayList getList()

  {

  DocumentBuilderFactory dbf =

  DocumentBuilderFactorynewInstance();

  DocumentBuilder db = null;

  Document doc=null;

  NodeList childlist = null;

  String elementName;

  String roleName;

  int index;

  ArrayList theList = new ArrayList();

  

  try{

  db = dbfnewDocumentBuilder();

  }catch(Exception e)

  {

  eprintStackTrace();

  }

  try{

  doc = dbparse(new File("securityxml"));

  }catch(Exception e)

  {

  eprintStackTrace();

  }

  //讀取頁面元素列表

  NodeList elementList = docgetElementsByTagName("htmlElement");

  for(int i=;i<elementListgetLength();i++)

  {

  Element name = ((Element)elementListitem(i));

  //頁面元素的名稱

  elementName = namegetAttribute("name");

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

  NodeList rolNodeList = ((NodeList)namegetElementsByTagName("roleName"));

  for(int j=;j<rolNodeListgetLength();j++)

  {

  //有權限的角色的名稱

  //roleName = ((Element)rolNodeListitem(j))getNodeValue();

  roleName = ((Element)rolNodeListitem(j))getAttribute("name");

  theListadd(new ElementAndRole(elementNameroleName));

  }

  }

  return theList;

  }

  

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

  private boolean isAuthentificated(String elementName)

  {

  String roleName = "";

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

  roleName=thispageContextgetSession()getAttribute("rolename”);

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

  if(roleListcontains(new ElementAndRole(elementNameroleName)))

  {

  return true;

  }

  }

  return  false;

  }

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

  class ElementAndRole{

  String elementName;

  String roleName;

  public ElementAndRole(String elementNameString roleName)

  {

  thiselementName=elementName;

  thisroleName=roleName;

  }

  public boolean equals(Object obj)

  {

  return(((ElementAndRole)obj)elementNameequals(thiselementName)&&((ElementAndRole)obj)roleNameequals(thisroleName));

  }

  }

  }

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

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

    在配置文件webxml中使用taglib元素確定TLD文件的位置在webxml中增加

  <taglib>

  <tagliburi>http://mytag</tagliburi>

  <tagliblocation>

  /WEBINF/mytagtld

  </tagliblocation>

  </taglib>

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

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

  <?xml version="" encoding="ISO" ?>

  <!DOCTYPE taglib

  PUBLIC "//Sun Microsystems Inc//DTD JSP Tag Library //EN"

  "

  <taglib>

  <tlibversion></tlibversion>

  <jspversion></jspversion>

  <shortname>myTag</shortname>

  <uri/>

  <tag>

  <name>JspSecurity</name>

  <tagclass>compresentationviewhelperJspSecurityTag</tagclass>

  <info>

  JspSecurityTag

  </info>

  <attribute>

  <name>elementName</name>

  <required>true</required>

  <rtexprvalue>true</rtexprvalue>

  </attribute>

  </tag>

  </taglib>


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20602.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.