java 自定义标签 权限标签 模仿shiro

二话不说,直接开干。

新建 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>

猜你喜欢

转载自blog.csdn.net/qq_36328170/article/details/82623362