今天同事问我,如何对jsp上用户的某个功能进行限制,具有相应的权限,则能执行相应的功能,否则不可见或者不能执行! 我当时告诉他可以建个类,这个类继承BodyTagSupport类。然后重写它的 doStartTag()方法!前提是还要在WEB-INF目录下建立tag文件夹,再tag文件夹下建立 .tld文件,然后再加以配置就可以实现限制权限的功能!晚上回到家闲着没事就把写了个源代码实例!欢迎大家拍砖!
首先,我们先建立 TagPrivilege 类
package cn.zg.tools;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class TagPrivilege extends BodyTagSupport {
private String privilegeContent;//权限的内容
private String trueMsg;// 有权限应输出的内容
private String falseMsg;//无权限应输出的内容
public String getPrivilegeContent() {
return privilegeContent;
}
public void setPrivilegeContent(String privilegeContent) {
this.privilegeContent = privilegeContent;
}
public String getTrueMsg() {
return trueMsg;
}
public void setTrueMsg(String trueMsg) {
this.trueMsg = trueMsg;
}
public String getFalseMsg() {
return falseMsg;
}
public void setFalseMsg(String falseMsg) {
this.falseMsg = falseMsg;
}
@Override
public int doStartTag() throws JspException{
String text = (String) pageContext.getSession().getAttribute("privilege");
try {
if(privilegeContent.equals(text)){
this.pageContext.getOut().write(trueMsg);
}else{
this.pageContext.getOut().write(falseMsg);
}
return EVAL_BODY_INCLUDE;
} catch (Exception e) {
// TODO: handle exception
}
return EVAL_BODY_INCLUDE;
}
}
然后我们还要配置.tld文件: 注意把TagPrivilege类中用到的属性写在tld文件中!如下:
<?xml version="1.0" encoding="UTF-8"?> <!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>privilege</shortname> <uri>http://cn.zg.tools/privilege</uri> <tag> <name>privilege</name> <tagclass>cn.zg.tools.TagPrivilege</tagclass> <attribute> <name>privilegeContent</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>trueMsg</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>falseMsg</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
如果是新手的话,可能对这个tld文件的xml代码中的标签有些陌生,别急,我来告诉大家。 name 标签对应的是标签类TagPrivilege的属性名, required 则表示是否为必填, rtexprvalue 表示在是否可以在里面写入EL表达式。
做完这一步,就算是大功告成了! ,那么如何进行使用呢? 请看下面的jsp代码!
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="p" uri="http://cn.zg.tools/privilege"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>权限测试</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<%
request.getSession().setAttribute("privilege","show");
%>
<body>
<p:privilege privilegeContent="close" trueMsg="欢迎访问,您已经获得权限!" falseMsg="您无权限
访问!"/>
</body>
</html>
不知大家可否注意:jsp页面上tablib引用的uri为: http://cn.zg.tools/privilege 。它和.tld文件中定义的uri标签是一致的!
现在大家猜想一下 页面的输出结果是什么,
首先假设用户已经登陆,我在session设置他对某个按钮的功能为可见,暂定为
request.getSession().setAttribute("privilege","show");
然后当我们在页面中使用
<p:privilege privilegeContent="close" trueMsg="欢迎访问,您已经获得权限!" falseMsg="您无权限
访问!"/>
这个标签的时候,就会自动的执行TagPrivilege类中的doStartTag()方法,方法中通过pageContext.getSession().getAttribute("privilege"); 得到用户的权限,
然后根据用户在标签上提供的
privilegeContent="close"
来进行比较,如果相等,则用户具有此权限,否则没有,由此可以进行扩展的是,用户登陆后我们获取用户的权限的集合,然后保存在session中,那么对应的某一个按钮,是否可以执行一个权限,那么就看这个session中的权限集合是否包含该按钮的权限,假如包含则:反馈trueMsg内容,否则反馈falseMsg内容!
我们可以把trueMsg 和 falseMsg 的内容写成true 或者false,当为fasle就把按钮设置为隐藏或者不可点击,为true则显示按钮或可点击! 这样就实现了用户对某个按钮上的权限的使用!
因为"close" != "show" ,所以页面会输出falseMsg的内容,即“您无权限访问!”,假如把
privilegeContent的值改为 "show",那么和session的键为“privilege”的值是一致的,那么输出“欢迎访问,您已经获得权限!”
为了新手学习,我提供了源码(里面还有我写的struts2的“国际化全局资源配置”源码,因为我写tag自定义标签是在前面这个项目上临时加的功能! 直接访问项目的index.jsp页面就可以看到国际化和tag自定义标签这两种技术的效果)放在附件里,欢迎下载! 老鸟请绕道! 呵呵!