一套完善的权限系统,不仅需要拦截对于后台方法的访问,还需要拦截前台的html内容,比如一个添加按钮是否可见。
针对于前台页面使用JSP实现的情况下,我们可以使用自定义JSP标签进行控制。
使用自定义jsp标签之前必须在web.xml中配置:
<jsp-config>
<taglib>
<taglib-uri>http://www.xinruan.cbb</taglib-uri>
<taglib-location>/WEB-INF/tlds/cbb.tld</taglib-location>
</taglib>
</jsp-config>
其中taglib-location指明了定义自定义标签的tld文件所处的位置,再看一下cbb.tld文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version><!-- 标签库的版本 -->
<jsp-version>1.2</jsp-version><!-- 这个标签库要求的JSP规范版本 -->
<short-name>cbb</short-name><!-- JSP页面编写工具可以用来创建助记名的可选名字 -->
<tag>
<name>access</name><!-- 唯一标签名 -->
<tag-class>com.xinruan.manager.tag.AccessTag</tag-class><!-- 标签HelloWorldTag类的完全限定名 -->
<body-content>scriptless</body-content><!-- 正文内容类型 -->
<attribute>
<name>privilege</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
接下来,我们还需要一个处理标签逻辑的class:
/**
* access标签的java类
*/
public class AccessTag extends TagSupport {
private static final long serialVersionUID = 3174234039143531070L;
/**
* 标签中的属性
*/
private String privilege;
@Override @SuppressWarnings("unchecked")
public int doStartTag() throws JspException {
HttpSession session=pageContext.getSession();
//从session中得到用户的权限列表
List<String> privileges = (List<String>)session.getAttribute("PRIVILEGES");
if (privileges.contains(privilege)) {
//用户权限列表中包含访问所需权限则返回EVAL_BODY_INCLUDE,即输出标签体的内容
return EVAL_BODY_INCLUDE;
}else{
//否则跳过标签体,即不显示标签包含的html内容
return SKIP_BODY;
}
}
@Override
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public String getPrivilege() {
return privilege;
}
public void setPrivilege(String privilege) {
this.privilege = privilege;
}
}
做完上面几步,我们的自定义标签就可以在jsp中使用了。
使用之前首先要在jsp的开头引入我们自定义的标签库,在jsp中加入下面这句话:
<%@ taglib prefix="cbb" uri="http://www.xinruan.cbb" %>
假如我们需要控制一个超链接的访问权限:
<cbb:access privilege="UserAdd"><a class="STYLE1" href="javascript:void(0)" οnclick="javascript:window.location.href='<s:url action="managerAction!addUI.action"/>'">添加</a></cbb:access>
其中privilege="UserAdd"这个属性定义了显示超链接所需权限。
OK,结合上一篇《基于struts2拦截器的权限控制系统1——后台方法的拦截》我们就能很方便的实现细粒度的权限控制了。