今天同事问我,如何对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自定义标签这两种技术的效果)放在附件里,欢迎下载! 老鸟请绕道! 呵呵!