自制权限框架(一)jsp标签
一、概述
在我们的系统中,很多时候都用到了权限。最简单的权限就是登录。登录了,我就可以自己的相关信息;没有登录,就不能看到。
目前比较流行的权限框架就是apache shiro和spring security,大家在选择时比较青睐apache shiro,因为spring security的拦截器过多,导致性能下降。
笔者在搭建系统时也是选择了Apache shiro。在权限框架中,最常用的两个地方是:
1、在controller层,使用@RequiresPermissions注解,标识这个链接只能是拥有这个权限的用户才能使用。
2、在jsp中,使用<shiro:hasPermission>标签,标识着拥有这个权限的用户才能够展示标签中的内容。
笔者在搭建系统时,由于采用了集群,session统一用redis管理,在使用shiro框架时,重写了shiro的sessionDAO,CRUD都在redis中。
在使用shiro的过程中,笔者发现一个request请求,在shiro的session管理中调用了40多次redis。虽然redis的性能非常好,但是调用40多次也没有必要。
所以,笔者基于java注解和jsp标签简单的实现了权限框架,它有一定的局限性,不过大家可以进行扩展。
二、jsp标签
在这一篇中,先向大家介绍jsp的权限标签。
首先,编写jsp标签的实现类,如下:
public class HasAnyPermission extends TagSupport {
@Setter@Getter
private String permissions; @Override
public int doStartTag() throws JspException {
HttpSession session = pageContext.getSession();
String[] arrPermissions = permissions.split(",");
//用户是否登录
if (UserSessionUtil.isLogin(session)){
Set<String> hasPermissions = (Set<String>) session.getAttribute(SESSION_ATTR_PLAT_PERMISSION);
//用户是否分配了权限
if(CollectionUtils.isNotEmpty(hasPermissions)){
for (String psermission : arrPermissions){
//用户分配的权限中,是否包含该权限
if (hasPermissions.contains(psermission)){
return TagSupport.EVAL_BODY_INCLUDE;
}
}
}
return TagSupport.SKIP_BODY;
}else {
return TagSupport.SKIP_BODY;
}
}
}
在这里,permissions为标签中传过来的权限,可以为多个,使用“,”隔开,这个可以大家可以扩展。
例如:自定义分隔符。这里就不详细介绍了;多个权限间的“或”,“与”关系等。
在jsp当中,标签都是成对出现的,在开始标签时,将会执行doStartTag()方法,对应的在结束标签时,将执行doEndTag()方法,上面的类中没有写出doEndTag()方法,将会执行父类TagSupport 中的doEndTag()方法。
doStartTag()方法中的具体逻辑这里不做介绍,无非就是判断这个用户有没有这个权限。最关键的是return的内容:
EVAL_BODY_INCLUDE:如果返回这个,则标签包含的内容会展示出来。
SKIP_BODY :标签包含的内容不会展示。
其次,创建tld文件
在 webapp/WEB-INF/ 下,创建taglib目录,并在taglib目录中,创建xxx.tld文件,如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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.1.2</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Apache Shiro</short-name>
<uri>/WEB-INF/taglib/xxx</uri> <!-- 配置成tld文件的目录,xxx为tld文件的文件名 -->
<description>Apache Shiro JSP Tag Library.</description>
<tag>
<name>hasAnyPermissions</name> <!--标签的名称 -->
<tag-class>com.rent.common.shiro.HasAnyPermission</tag-class> <!-- 实现的类,上面编写的HasAnyPermission类 -->
<body-content>JSP</body-content>
<attribute> <!--传入参数-->
<name>permissions</name> <!--参数名称-->
<required>true</required> <!--是否必传-->
<rtexprvalue>true</rtexprvalue> <!--是否可用jsp表达式-->
</attribute>
</tag>
</taglib>
uri的参数需要在jsp中引用,tag的name属性是标签的名称,permissions是变量的名称,由jsp中传入,而且必传。
最后,标签的使用
在jsp的头部引入自定义标签,如下:
<%@taglib prefix="pm" uri="/WEB-INF/taglib/xxx"%>
uri为tld文件中配置的uri,prefix是标签的前缀,可以自定义,我们定义成pm。
权限标签的使用,如下:
<pm:hasAnyPermissions permissions="show">哈哈</pm:hasAnyPermissions>
当我们在编译器中敲入 <pm:,就会出现提示,hasAnyPermissions就是我们在tld文件中定义的name,permissions是需要的权限,而且必传。
这样,当用户拥有“show”这个权限时,将会展示出“哈哈”,没有“show”权限时,不会展示。
至此,jsp的自定义权限标签就介绍完了,还请大家多多指教。下一篇将会介绍controller中的权限注解的实现。
自制权限框架(一)jsp标签的更多相关文章
- java框架之Shiro-安全/权限框架
准备 简介 Apache Shiro 是 Java 的一个安全(权限)框架. Shiro 不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境. Shiro 可以完成:认证.授权.加密.会 ...
- 安全框架 - Shiro与springMVC整合的注解以及JSP标签
Shiro想必大家都知道了,之前的文章我也有提过,是目前使用率要比spring security都要多的一个权限框架,本身spring自己都在用shiro,之前的文章有兴趣可以去扒一下 最近正好用到s ...
- Apache Shiro权限框架在SpringMVC+Hibernate中的应用
在做网站开发中,用户权限必须要考虑的,权限这个东西很重要,它规定了用户在使用中能进行哪 些操作,和不能进行哪些操作:我们完全可以使用过滤器来进行权限的操作,但是有了权限框架之后,使用起来会非常的方便, ...
- Shiro 权限框架使用总结
我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨 ...
- shiro权限框架
权限的组成部分:用户 资源 角色 权限 数据库关系表设计是根据自己项目需求设计的 account表role表(id,rolename)account_role(id,aid,rid)permissio ...
- Java 权限框架 Shiro 实战二:与spring集成、filter机制
转自:https://www.cnblogs.com/digdeep/archive/2015/07/04/4620471.html Shiro和Spring的集成,涉及到很多相关的配置,涉及到shi ...
- 关于Apache Shiro权限框架的一些使用误区的解释
多了不说了,进入正题,shiro是个权限框架提供权限管理等功能,网上的教程一般都是互相抄,比如<shiro:principal property="xxx"/>这个标签 ...
- Shiro权限框架简介
http://blog.csdn.net/xiaoxian8023/article/details/17892041 Shiro权限框架简介 2014-01-05 23:51 3111人阅读 评论 ...
- Apache Shiro安全(权限框架)学习笔记二
课程目标 通过学习本课程掌握权限管理的设计思想及方法,使用Shiro框架完成权限管理功能开发. 1. 理解基于资源的权限管理方法. 2. 掌握权限管理的数据模型. 3. 掌握不使用shiro开发 ...
随机推荐
- centos7下,解决Apache错误日志文件过大问题
1,日志文件太大问题 第一步:停止Apache服务的所有进程,删除 /var/log/httpd目录下的 error.log.access.log文件 第二步:打开 /etc/httpd/conf ...
- 【源码解析】BlockManager详解
1 Block管理模块的组件和功能 BlockManager:BlockManager源码解析 Driver和Executor都会创建 Block的put.get和remove等操作的实际执行者 Bl ...
- 支付宝支付-常用支付API详解(查询、退款、提现等)
所有的接口支持沙盒环境的测试 1.前言 前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支 ...
- 学习笔记TF019:序列分类、IMDB影评分类
序列分类,预测整个输入序列的类别标签.情绪分析,预测用户撰写文字话题态度.预测选举结果或产品.电影评分. 国际电影数据库(International Movie Database)影评数据集.目标值二 ...
- 使用DotNetty编写跨平台网络通信程序
长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...
- css中那些容易被我们程序猿所忽略的选择器
css中那些容易被我们程序猿所忽略的选择器 作为一个程序猿,我们可能会遇到这样的问题,假如:有5个li,要求给第三个li设置背景颜色怎么办?有人会说,用JS啊,循环遍历出第三个不就行了.但是,用JS解 ...
- 简化布隆过滤器——BitMap
简化布隆过滤器--BitMap 前言 前段开发项目试就发现,一部分的代码实现存在着一些性能上的隐患.但当时忙于赶进度和由于卡发中的不稳定因素,想了许多解决方案也没有机会实施.最近,正好趁个机会进行一系 ...
- Chapter2:Discrete-Time Signal Processing and Short-Time Fourier Analysis
作者:桂. 时间:2017-05-24 08:44:53 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 这一 ...
- orcale设置自增列
create sequence SEQ_ERRORID minvalue 1 maxvalue 99999999 start with 1000 increment by 1 nocache orde ...
- java排序算法之冒泡排序
冒泡排序的基本思想即将一串数字进行由小到大进行排序 例如1,9,7,2,4,3,6,10,20,5 实现思路: 第一个数分别与接下来的数字做对比 第一次 1<9不变,再1<7不变,1&l ...