用Jsp-tags制作一个权限标签

需求说明

一个权限标签,作用是在标签里面的内容如果在用户权限范围内,就响应(输出标签里面包含的内容)。需要JSP-API的依赖

  <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
  </dependency>

定义DTD

这里定义了一个role的标签,接受一个参数roleCode,这里为我自己项目里面定义的权限编码.这里文件名为x.dtd,放在WEB-INF目录下.

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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>2.4</jspversion>
    <shortname>x</shortname>
    <tag>
        <name>role</name>
        <tagclass>com.xdnote.Role</tagclass>
        <bodycontent>JSP</bodycontent>
        <attribute>
            <name>roleCode</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

写标签处理类 Role

public class Role extends TagSupport{
    private String roleCode;
    public String getRoleCode() {
        return roleCode;
    }
    public void setRoleCode(String roleCode) {
        this.roleCode = roleCode;
    }

    @Override
    public int doStartTag() throws JspException {
        //如果有权限,则输出标签内内容,否则不输出
        HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
        //这里的RoleUtil是我的另外一个类,不贴代码了: 功能如下
        // 1. 根据request获取当前登录用户
        // 2. 根据 当前用户 与 roleCode 来判断当前用户是否具有roleCode的权限
        if(RoleUtil.hasRole(request,roleCode)){
            return EVAL_BODY_INCLUDE;
        }
        return  SKIP_BODY;
    }
}

将dtd文件加入到web.xml

    <jsp-config>
        <taglib>
            <taglib-uri>x</taglib-uri>
            <taglib-location>x.tld</taglib-location>
        </taglib>
    </jsp-config>

最后,使用

<%@taglib prefix="x" uri="x"%>
<x:role roleCode="delete">
    <!-- 仅具有delete权限的用户才会输出这一段代码 -->
    <a href="/delete">删除</a>
</x:role>

<script>
var showItem = ['custom'];
<x:role roleCode="vip">
    // 仅具有vip权限的用户才会输出这一段代码
    showItem.push('vip');
</x:role>
console.log(showItem);
</script>