基于jfinal Template的Shiro 标签

简介:

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标签,原理类似。

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标签,原理类似。

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);
}```
目录
相关文章
|
3月前
|
前端开发 JavaScript UED
JFinal框架中防止表单重复提交的方法
每种方法都有其优势和局限性。Token机制能提供较为稳定可靠的保护,但增加了服务器端的处理负担。锁定机制在处理并发请求时更有效,但可能导致用户体验的下降。JavaScript客户端控制提供了良好的用户体验,但依赖于客户端的执行环境。在实际应用中,可以根据具体的场景和需求,选择最适合的方法,或者将多种方法组合使用,以达到最佳的效果。
42 10
|
JavaScript 前端开发 Java
JFinal框架单文件、多文件上传详解
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/79386540 简介  ...
2792 0
|
Java PHP Spring
从今天开始,要入jfinal的坑了,试试这破框架好不好用。
公司要用jfinal,所以我要入坑了。 听说时去年很火的java框架,不知好不好,试试水吧。 看官网就想吐槽 看个文档吧,还要注册。。。现在是2017年吗?? 好吧,注册完了,接着就。
2020 0
|
Java 调度 Maven
JFinal框架_定时触发程序
JFinal框架进行作业调度,使用JFinal-ext2与quartzf进行配置。 maven说明: com.jfinal jfinal 3.2 com.jfinal jfinal-ext2 2.
1708 0
|
Java 数据格式 XML
jfinal框架文件下载功能代码
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/72779838 一. 前言   上一篇博客我们了解了struts2框架的文件下载功能代码,我们可以从中总结到,struts2主要是通过其xml的配置来处理文件下载的,也就是将普通io流文件下载的页面响应方式的这部分代码分离出来,使用xml配置来处理,这也是struts2的特性。
1760 0
|
Java
基于Java的JFinal框架快速上手
http://finalshares.com/read-737
1171 0
|
Oracle 关系型数据库 Java
jfinal框架教程-学习笔记(二)
上一节介绍了jfinal框架的简单搭建,这节通过一个小例子了解jfinal的结构和特点 先上图 1、建数据库(我用的是oracle数据库,其他的相对也差不多) -- Create table create table CLASSES ( classesid NUMB...
1313 0
|
XML Java 数据格式
快速的搭建JFinal的ORM框架示例
  分类: Java2013-12-11 20:55 11075人阅读 评论(12) 收藏 举报 刚把Spring MVC搭建完毕,在群里一个人问如何搭建JFinal + Httl,我就先打架了一个JFinal环境。
1182 0