控制客户端访问是开发一个基于B/S的架构的系统的开发者必须考虑的问题。JSP或SERVLET规范的基于配置文件的安全策略对资源的控制是以文件为单位的,即只可以定义某个视图全部可以或全部不能被访问。一个比较复杂的系统往往要要求对视图的一部分(如JSP页面里的一个按钮)提供访问控制,只允许被某种角色的用户访问。如果采用可编程的安全策略,因为对用户角色和操作的定义在开发时不能定义,而且这种策略加大了程序员的工作量,它可能不是一种好的办法。
我采用定制标签库和和配置文件来解决这个问题:把要权限控制的JSP页面元素如BUTTON,作为标签的内容。为受保护的内容起一个唯一的名称,把这个名称作为标签的一个属性。某个角色对某个页面元素或一组页面元素是否有权限,在XML配置文件中描述。
例如,下面的JSP页面有“详细”和“修改”两个按钮。
<%@ taglib="" uri="http://mytag" prefix="custTag">
test
<input type="button" name="detail" value="详细" >
<input type="button" name="modify" value="修改" >
下面XML配置文件内容表示对角色为common的用户,只对名为employeedetail的页面元素即“详细”按钮有权限,对角色为“admin”的用户,对名为employeedetail和employeemodify的页面元素即两个按钮都有权限。
定制标签类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中增加:
http://mytag
/WEB-INF/mytag.tld
3、TLD文件必须使用taglib元素标识每个定制标签极其属性。
下面是使用这个标签库对应的TLD文件
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
1.0
1.1
myTag
JspSecurity
com.presentation.viewhelper.JspSecurityTag
JspSecurityTag
elementName
true
true
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 没有查询到任何记录。
最新文章
没有查询到任何记录。
java排序集锦源码Spring技术内幕jsp运行时我们常遇到的几个问题?NteBeans下JSP连接MySQL示例
人气排行 Java语言中内存泄漏及如何检测问题详解JSP中errorPage设置方法在JSP页面中实现检索数据的分页显示JAVA实现屏幕抓图 远程桌面控制用JSP下载word文件(不会直接用IE打开)如何直接在浏览器内运行SQL命令无边框窗口代码详解Spring技术内幕
查看所有0条评论>>