|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。js|会见|把持|页面把持客户端会见是开辟一个基于B/S的架构的体系的开辟者必需思索的成绩。JSP或SERVLET标准的基于设置文件的平安战略对资本的把持是以文件为单元的,即只能够界说某个视图全体能够或全体不克不及被会见。一个对照庞大的体系常常要请求对视图的一部分(如JSP页面里的一个按钮)供应会见把持,只同意被某种脚色的用户会见。假如接纳可编程的平安战略,由于对用户脚色和操纵的界说在开辟时不克不及界说,并且这类战略加年夜了程序员的事情量,它大概不是一种好的举措。
我接纳定制标签库和和设置文件来办理这个成绩:把要权限把持的JSP页面元素如BUTTON,作为标签的内容。为受回护的内容起一个独一的称号,把这个称号作为标签的一个属性。某个脚色对某个页面元素或一组页面元素是不是有权限,在XML设置文件中形貌。
比方,上面的JSP页面有“具体”和“修正”两个按钮。
<%@tagliburi="http://mytag"prefix="custTag"%>
<html>
<head>
<title>test</title>
</head>
<body>
<formname="form1">
<tablewidth="600"border="0"cellspacing="0"cellpadding="2">
<tr>
<td>
<custTag:JspSecurityelementName="employeedetail">
<inputtype="button"name="detail"value="具体">
</custTag:JspSecurity>
<custTag:JspSecurityelementName="employeemodify">
<inputtype="button"name="modify"value="修正">
</custTag:JspSecurity>
</td>
</tr>
</table>
<br>
</form>
</body>
上面XML设置文件内容暗示对脚色为common的用户,只对名为employeedetail的页面元素即“具体”按钮有权限,对脚色为“admin”的用户,对名为employeedetail和employeemodify的页面元素即两个按钮都有权限。
<?xmlversion="1.0"encoding="GB2312"?>
<security>
<htmlElementname="employeedetail">
<roleNamename="common"/>
<roleNamename="admin"/>
</htmlElement>
<htmlElementname="employeemodify">
<roleNamename="admin"/>
</htmlElement>
</security>
定制标签类JspSecurityTag承继了BodyTagSupport类。BodyTagSupport有一个变量bodyContent指向肇端标记和停止标记之间的内容。JspSecurityTag的公有静态变量roleList保留从XML文件中取到脚色和页面元素的对应汇合,公有变量ElementName对应页面元素的称号。当剖析该定制标签时,起首先取到页面元素的称号,再取到以后用户的脚色,假如脚色有该页面元素的权限,就显现标签注释(即页面元素),不然不显现。
Pagekagecom.presentation.viewhelper.JspSecurityTag;
importjavax.servlet.jsp.tagext.*;
importjavax.servlet.jsp.*;
importjava.util.*;
importorg.xml.sax.*;
importorg.xml.sax.helpers.*;
importorg.w3c.dom.*;
importjava.io.*;
importjavax.xml.parsers.*;
publicclassJspSecurityTagextendsBodyTagSupport{
//保留从XML文件中取到脚色和页面元素的对应汇合
privatestaticArrayListroleList;
//页面元素的称号
privateStringelementName;
publicvoidsetElementName(Stringstr)
{
this.elementName=str;
}
publicintdoAfterBody()throwsJspException{
if(roleList==null)
{
roleList=getList();
}
try{
//假如认证经由过程就显现标签注释,不然跳过标签注释,就这么复杂
if(isAuthentificated(elementName))
{
if(bodyContent!=null){
JspWriterout=bodyContent.getEnclosingWriter();
bodyContent.writeOut(out);
}else
{
}
}
}catch(Exceptione){
thrownewJspException();
}
returnSKIP_BODY;
}
//从XML设置文件中取到脚色和页面元素的对应,保留到静态的ArrayList
privateArrayListgetList()
{
DocumentBuilderFactorydbf=
DocumentBuilderFactory.newInstance();
DocumentBuilderdb=null;
Documentdoc=null;
NodeListchildlist=null;
StringelementName;
StringroleName;
intindex;
ArrayListtheList=newArrayList();
try{
db=dbf.newDocumentBuilder();
}catch(Exceptione)
{
e.printStackTrace();
}
try{
doc=db.parse(newFile("security.xml"));
}catch(Exceptione)
{
e.printStackTrace();
}
//读取页面元素列表
NodeListelementList=doc.getElementsByTagName("htmlElement");
for(inti=0;i<elementList.getLength();i++)
{
Elementname=((Element)elementList.item(i));
//页面元素的称号
elementName=name.getAttribute("name");
//该页面元素对应的有权限的脚色的列表
NodeListrolNodeList=((NodeList)name.getElementsByTagName("roleName"));
for(intj=0;j<rolNodeList.getLength();j++)
{
//有权限的脚色的称号
//roleName=((Element)rolNodeList.item(j)).getNodeValue();
roleName=((Element)rolNodeList.item(j)).getAttribute("name");
theList.add(newElementAndRole(elementName,roleName));
}
}
returntheList;
}
//反省该脚色是不是有该页面元素的权限
privatebooleanisAuthentificated(StringelementName)
{
StringroleName="";
//在用户上岸时把该用户的脚色保留到SESSION中,这里只是间接从SESSION中取用//户脚色。
roleName=this.pageContext.getSession().getAttribute("rolename”);
//roleList包括elementName属性为elementName,roleName属性为roleName的//ElementAndRole对象,则该脚色有该页面元素的权限
if(roleList.contains(newElementAndRole(elementName,roleName)))
{
returntrue;
}
}
returnfalse;
}
//暗示脚色和页面元素的对应的干系的外部类
classElementAndRole{
StringelementName;
StringroleName;
publicElementAndRole(StringelementName,StringroleName)
{
this.elementName=elementName;
this.roleName=roleName;
}
publicbooleanequals(Objectobj)
{
return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));
}
}
}
在标签库能被JSP页面利用前,要做以下三个步骤
1、在JSP页面中包含一个taglib元素,断定必要加载到内存的标签库。后面的JSP文件的第一行:<%@tagliburi="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文件
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!DOCTYPEtaglib
PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.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>
ruby里有这些工具吗?又要简单多少?我没有用过这两门语言,我估计在这些语言力没有很统一的这种标准,或者根本就没有提供。 |
|