基于jfinal Template的Shiro 标签
时间:2022-04-27
本文章向大家介绍基于jfinal Template的Shiro 标签,主要内容包括继承Directiv形式、共享对象扩展、指令注解加载、PS、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
jfinal template 经过 3.0、3.1 两个版本的迭代,已经非常稳定优秀了,所以我从传统的jsp 迁移到了jf template ,jsp中使用shiro 的标签库,可以很方便的实现权限的控制例如:
<shiro:guest>
用户未登录状态显示
</shiro:guest>
<shiro:user>
欢迎[<shiro:principal/>]登录
</shiro:user>
结合jf模板灵活指令扩展,来实现这么一套标签非常简单。
继承Directiv形式
public class GuestTag extends Directiv {
private Subject getSubject() {
return SecurityUtils.getSubject();
}
public void exec(Env env, Scope scope, Writer writer) {
if (getSubject() == null || getSubject().getPrincipal() == null)
stat.exec(env, scope, writer);
}
public boolean hasEnd() {
return true;
}
}
在config中配置
public void configEngine(Engine me) {
me.addDirective("guest", new GuestTag());
}
页面中使用
#guest()
用户未登录状态显示
#end
带入参类型标签处理
public class HasRoleTag extends Directiv {
private Expr[] exprs;
private Subject getSubject() {
return SecurityUtils.getSubject();
}
public void setExprList(ExprList exprList) {
exprs = exprList.getExprArray();
}
public void exec(Env env, Scope scope, Writer writer) {
boolean hasRole = false;
if (getSubject() != null && ArrayUtil.isNotEmpty(exprs))
if (getSubject().hasRole(exprs[0].toString()))
hasRole = true;
if (hasRole)
stat.exec(env, scope, writer);
}
public boolean hasEnd() {
return true;
}
}
页面中使用
#hasRole(roleName)
body
#end
共享对象扩展
使用这种形式就更舒服了
public class ShiroTag {
private Subject getSubject() {
return SecurityUtils.getSubject();
}
public boolean isGuest() {
return getSubject() == null || getSubject().getPrincipal() == null;
}
public boolean hasRole(String roleName) {
return getSubject() != null && getSubject().hasRole(roleName);
}
public boolean lacksRole(String roleName) {
boolean hasRole = getSubject() != null
&& getSubject().hasRole(roleName);
return !hasRole;
}
}
config中配置一下
public void configEngine(Engine me) {
me.addSharedObject("shiro",ShiroTag);
}
页面使用
#if(shiro.hasRole(roleName))
body
#end
打完 收工~
指令注解加载
shiro标签种类很多,具体的逻辑也可以自己实现,所以我们写好以后,配置在config 是一件比较痛苦的事情,稍不留神,就配置错误了。所以我们可以通过注解扫描的形式方便配置。(其他自定义指令 也可以使用,方法相同)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
//@Inherited 不继承
public @interface DefineDirective {
/**
* 标签名称
*
* @return String
*/
String tag() default "";
}
@DefineDirective(tag = "hasRole")
public class HasRoleTag extends Directiv {...}
然后写这么一个EngineKit
//classUtils 使用的是 hutool 工具包的方法。。。
public static void addShiroDefineDirective(Engine me) {
Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(defineDirective, DefineDirective.class);
for (Class<?> clazz : classes) {
DefineDirective defineDirective = clazz.getAnnotation(DefineDirective.class);
String tag = defineDirective.tag();
if (StrUtil.isNotEmpty(tag)) {
me.addDirective(tag, (Directive) ClassUtil.newInstance(clazz));
} else {
LogKit.error("自定义Directive的标签为空无效:" + clazz.getName());
}
}
}
config中配置一下
public void configEngine(Engine me) {
EngineKit.addShiroDefineDirective(me);
}
PS
当然上边的扩展,并没有和我们的shiro插件集成,我实现了一个与JfinalShiroPlugin@玛雅牛无缝集成的版本内置这个shiro标签,原理类似。
JfinalShiroPlugin: http://git.oschina.net/log4j/jfinalshiroplugin
然后具体使用项目整合栗子: http://git.oschina.net/log4j/LMS
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring @Autowired npe example:Why your Spring @Autowired component is null
- Spring JPA 查询创建
- 『Python动手学』Python处理.mat文件
- Swift 打开三方地图 腾讯地图、百度地图、高德地图、Apple 地图
- 初学者应该看的JavaScript Promise 完整指南
- React Advanced Topics
- try catch引发的性能优化深度思考
- 用于自动驾驶车辆视觉定位的地图存储:ORB-SLAM2的一种拓展
- c# 动态产生控件 注册动态控件事件
- leetcode 一些算法题及答案
- 得分--UVa1585
- 如何计算一个程序的运行时间
- c语言输入回车结束输入
- C# devExpress BandedGridView属性 备忘
- 结构体的应用及所有形式