二话不说,直接开干。
新建 permission.tld
内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description> permission taglib</description>
<display-name>permission taglib</display-name>
<tlib-version>1.0</tlib-version>
<short-name>privilege</short-name>
<!-- 在taglib.jsp文件中加上如下内容,<%@ taglib uri="<span style="font-family: Arial, Helvetica, sans-serif;">http://vanfon.p2p.cn/</span>"
prefix="p2p"%> uri中的值必须与标签<uri></uri>中的值一致,prefix名称随便取,取完后JSP那端的前缀名必须与这一致。 -->
<uri>http://permission.cn/</uri>
<tag>
<description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>
<name>hasPermission</name><!-- 里面的内容是JSP文件中标签里面的<p2p:permission module="admin" privilege="delete">permission -->
<tag-class>com.jiumai.carnet.bean.PermissionTag</tag-class><!-- JSP文件中的自定义标签里面的值会传到PermissionTag类接受,PermissionTag类接受到的值决定是否要显示JSP文件中自定义标签的内容。 -->
<body-content>JSP</body-content><!-- 里面的值代表<p2p:permission module="admin" privilege="delete">只不能用在JSP中。 -->
<attribute>
<description></description>
<name>name</name><!-- 里面的值代表JSP文件中自定义标签 <p2p:permission module="admin" privilege="delete">中的module。-->
<required>true</required><!-- 里面的值代表在JSP文件中敲入自定义标签(<p2p:permission)的时候,自定义标签里面属性名称(module)不用手工去写会自动显示出来。 -->
<rtexprvalue>false</rtexprvalue><!-- 里面的值代表JSP文件中自定义标签的属性的值不能用EL表达式(${})来表示,如果为true自定义标签的属性的值能用EL表达式(${})来表示。 -->
</attribute>
</tag>
</taglib>
新建java 类
package com.jiumai.carnet.tag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jiumai.carnet.bean.UserAuthorizationBean;
import com.jiumai.carnet.bean.UserLocal;
import com.jiumai.carnet.common.utils.SpringContextUtils;
/**
*
* @date 2018年9月10日
*/
public class PermissionTag extends TagSupport {
protected Logger logger = LoggerFactory.getLogger(getClass());
private static final long serialVersionUID = 1L;
private static PermissionTagService permissionTagService;
/* 标签要接收的属性 */
private String name;
@Override
public int doStartTag() {
try {
//自己定义标签显示的逻辑
if (permissionTagService == null) {
permissionTagService = (PermissionTagService) SpringContextUtils.getBean(PermissionTagService.class);
}
UserAuthorizationBean user = UserLocal.getUser();
if (permissionTagService.hasPermission(user, name)) {
// 让标签体显示
return Tag.EVAL_BODY_INCLUDE;
} else {
// 让标签体不显示
return Tag.SKIP_BODY;
}
} catch (Exception e) {
logger.info("没有实现权限");
return Tag.SKIP_BODY;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
附上工具类
package com.jiumai.carnet.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Spring Context 工具类
* @date 2017年8月20日 下午10:50:24
*/
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
/**
* 适用于在@Service后面什么也没有
* @date 2018年9月10日
* @param c
* @return
*/
public static Object getBean(Class c) {
return applicationContext.getBean(c);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<? extends Object> getType(String name) {
return applicationContext.getType(name);
}
}
在webx.xml 里添加
<!-- 自定标签定义 -->
<jsp-config>
<taglib>
<taglib-uri>http://permission.cn/</taglib-uri>
<taglib-location>/WEB-INF/tlds/permission.tld</taglib-location>
</taglib>
</jsp-config>
使用案列
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<%@ taglib prefix="pr" uri="http://permission.cn/" %>
<html>
<body>
<pr:hasPermission name="user:create">
<a href="createUser.jsp">Create a new User</a>
</pr:hasPermission>
<pr:hasPermission name="user:list">
<a href="createUser.jsp">dierge</a>
</pr:hasPermission>
</body>
</html>