知识大全 用定制标签库和配置文件实现对JSP页面元素的访问控制

Posted 元素

篇首语:你应该小心一切假知识,它比无知更危险。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用定制标签库和配置文件实现对JSP页面元素的访问控制相关的知识,希望对你有一定的参考价值。

用定制标签库和配置文件实现对JSP页面元素的访问控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  控制客户端访问是开发一个基于B/S的架构的系统的开发者必须考虑的问题 jsp或SERVLET规范的基于配置文件的安全策略对资源的控制是以文件为单位的 即只可以定义某个视图全部可以或全部不能被访问 一个比较复杂的系统往往要要求对视图的一部分(如JSP页面里的一个按钮)提供访问控制 只允许被某种角色的用户访问 如果采用可编程的安全策略 因为对用户角色和操作的定义在开发时不能定义 而且这种策略加大了程序员的工作量 它可能不是一种好的办法

  我采用定制标签库和和配置文件来解决这个问题 把要权限控制的JSP页面元素如BUTTON 作为标签的内容 为受保护的内容起一个唯一的名称 把这个名称作为标签的一个属性 某个角色对某个页面元素或一组页面元素是否有权限 在xml配置文件中描述

  

  例如 下面的JSP页面有“详细”和“修改”两个按钮

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

  <>

  <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配置文件内容表示对角色为mon的用户 只对名为employeedetail 的页面元素即“详细”按钮有权限 对角色为“admin”的用户 对名为employeedetail 和employeemodify的页面元素即两个按钮都有权限

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

  <security>

  <Element name=employeedetail >

  <roleName name=mon />

  <roleName name=admin />

  </Element>

  <Element name=employeemodify >

  <roleName name=admin />

  </Element>

  </security>

  

  定制标签类JspSecurityTag继承了BodyTagSupport类 BodyTagSupport有一个变量bodyContent指向起始标志和结束标志之间的内容 JspSecurityTag的私有静态变量roleList保存从XML文件中取到角色和页面元素的对应集合 私有变量ElementName对应页面元素的名称 当解析该定制标签时 首先先取到页面元素的名称 再取到当前用户的角色 如果角色有该页面元素的权限 就显示标签正文(即页面元素) 否则不显示

  

  Pagekage presentation viewhelper JspSecurityTag;

  

  import javax servlet jsp tagext *;

  import javax servlet jsp *;

  import java util *;

  import xml sax *;

  import xml sax helpers *;

  import w c 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("Element");

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

  

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

  //页面元素的名称

  elementName = name getAttribute("name");

  //该页面元素对应的有权限的角色的列表

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

  for(int j= ;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页面使用前 要做以下三个步骤

     在JSP页面中包括一个taglib元素 确定需要加载到内存的标签库 前面的JSP文件的第一行 <%@ taglib uri="//mytag" prefix="custTag" %>做的就是这件事

     在配置文件web xml中使用taglib元素确定TLD文件的位置 在web xml中增加

  <taglib>

  <taglib uri>//mytag</taglib uri>

  <taglib location>

  /WEB INF/mytag tld

  </taglib location>

  </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> presentation viewhelper JspSecurityTag</tagclass>

  <info>

  JspSecurityTag

  </info>

  <attribute>

  <name>elementName</name>

  <required>true</required>

  <rtexprvalue>true</rtexprvalue>

  </attribute>

  </tag>

cha138/Article/program/Java/JSP/201311/20602

相关参考

知识大全 在jsp页面判断struts2变量的值

  首先在action里面要用变量sex并且要有get方法  jsp页面中可以用ONGL标签$sex 直接输出变量sex的值  <s:propertyvalue=sex/>也可以输出但好像

知识大全 访问JSP文件或者Servlet文件时提示下载的解决方法

访问JSP文件或者Servlet文件时提示下载的解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 JSP页面文件目录树源码(递归算法)

JSP页面文件目录树源码(递归算法)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <%@

知识大全 为tomcat页面设置访问权限

  在web应用中对页面的访问控制通常通过程序来控制流程为登录>设置session>访问受限页面时检查session是否存在如果不存在禁止访问  对于较小型的web应用可以通过tomcat

知识大全 web.config配置文件中的 元素

  指定需要应用特定的配置设置的资源  配置结构的示例  <configuration>  <location>  <locationpath=pathallowover

知识大全 如何在写JSP文件的时候,用JSP操作Cookie[4]

如何在写JSP文件的时候,用JSP操作Cookie[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 如何在写JSP文件的时候,用JSP操作Cookie[3]

如何在写JSP文件的时候,用JSP操作Cookie[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 如何在写JSP文件的时候,用JSP操作Cookie[2]

如何在写JSP文件的时候,用JSP操作Cookie[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 如何在写JSP文件的时候,用JSP操作Cookie[1]

如何在写JSP文件的时候,用JSP操作Cookie[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 通过注解简化spring aop织入点的指定

   大型Javaweb应用往往有很大的系统访问量为了保护服务器免于出现过载的情况一般都需要对流量进行控制对于web页面的访问一般通过配置服务器或者apache可以起到保