欢迎光临
我们一直在努力

用定制标签库和配置文件实现对jsp页面元素的访问控制_jsp技巧

建站超值云服务器,限时71元/月

       控制客户端访问是开发一个基于B/S的架构的系统的开发者必须考虑的问题。JSPSERVLET规范的基于配置文件的安全策略对资源的控制是以文件为单位的,即只可以定义某个视图全部可以或全部不能被访问。一个比较复杂的系统往往要要求对视图的一部分(如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属性为elementNameroleName属性为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>


3TLD文件必须使用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>

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用定制标签库和配置文件实现对jsp页面元素的访问控制_jsp技巧
分享到: 更多 (0)

相关推荐

  • 暂无文章