最近项目中使用了spring boot搭建项目,使用spring security管理项目中的权限,使用freemarker作为视图层。为了将权限控制到按钮上,因此考虑直接使用spring security的标签实现,但是在整合的过程中,没有整合出来,突然想到freemarker可以自定义指令实现一些功能,因此记录一下,在freemarker中如何实现一个自定义指令,来达到实现部分内容的显示和隐藏。

需求:自定义一个freemarker标签,当满足某些条件的时候显示标签体中的内容,否则不进行显示。

实现步骤:

1、编写一个类实现 TemplateDirectiveModel 接口(freemarker实现自定义标签需要实现这个接口)

2、编写一个freemarker的配置类,在freemarker的Configuration中注册这个自定义标签

3、页面上进行使用

一、编写一个类实现TemplateDirectiveModel接口

public class AuthDirective implements TemplateDirectiveModel {

	private static final String AUTH = "auth";

	@Override
public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
// 1.获取用户所有的权限
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
// 2.获取标签中auth属性的值,此处我知道前台页面传递过来的是String类型,所以可以直接强制转换成SimpleScalar类型
SimpleScalar auth = (SimpleScalar) map.get(AUTH);
// 3、给页面上的循环变量设置值
if (null != templateModels && templateModels.length > 0) {
templateModels[0] = new SimpleScalar("<span style='color:red'>这个是后台返回的值</span>"); // 返回给前台一个String的类型
templateModels[1] = new StringArraySequence(new String[]{"张三", "李四", "王五"}); // 返回给前台一个Sequence类型
}
// 4.判断用户是否拥有这个权限
if (authorities.contains(new SimpleGrantedAuthority(auth.getAsString()))) {
// 显示指令包含的中间的内容
templateDirectiveBody.render(environment.getOut());
}
}
}

   注:1、map中的key是String类型,value是TemplateModel类型   

          2、key可以简单的理解为自定义标签中的属性值,value为属性对应的值, key和value是可以有多个的。

          3、eg <@auth auth="03"></@auth>  ===> key=auth value=03

          4、templateDirectiveBody可以简单理解为标签体中的内容

          5、templateModels这个是循环变量<@auth auth="03";loopVar01></@auth>  loopVar01这个就是一个循环变量,后台赋值之后,前台可以获取到这个值

二、注册这个自定义标签

@Configuration
public class FreemarkerConfig implements InitializingBean { @Autowired
@Qualifier("freeMarkerConfiguration")
private freemarker.template.Configuration freeMarkerConfiguration; @Bean
public AuthDirective authDirective() {
return new AuthDirective();
} @Override
public void afterPropertiesSet() throws Exception {
freeMarkerConfiguration.setSharedVariable("auth", authDirective());
}
}

   注:上方的auth表示页面上的自定义的标签标签名是auth

三、页面上使用(我页面上登录的用户是有03权限,没有01权限)

<@auth auth="03";loopVar01,loopVar02>
我可以出来,获取到后台返回${loopVar01}<br/>
<#list loopVar02 as loop>
per : ${loop_index}-${loop}
</#list>
</@auth>
<@auth auth="01">
因为我没有这个权限,所以出不来
</@auth>
auth auth="03";loopVar01,loopVar02>
我可以出来,获取到后台返回${loopVar01}<br/>
<#list loopVar02 as loop>
per : ${loop_index}-${loop}
</#list>
</@auth>
<@auth auth="01">
因为我没有这个权限,所以出不来
</@auth>

   注:@auth 这个就是自定义标签,此处表示是auth标签  auth="03" 表示有一个属性是auth,并且它的值是03

          loopVar01和loopVar02都是后台返回给前台的数据

 四、运行效果

  可以看到拥有03权限中的内容出来了,而01权限中的内容没有出来,因此就达到了我们要实现的效果。

freemarker自定义指令的更多相关文章

  1. 基于SSM3框架FreeMarker自定义指令(标签)实现

    通过之前的Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解系列文章,我们已经成功的整合到了一起,这次大象将在此基础上对框架中的FreeMarker模板 ...

  2. freemarker自定义标签(三)-nested指令

    freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...

  3. [freemarker篇]06.超级强大的自定义指令

    Freemarker的自定义指令是很强大的,非常强大,在之后的教程中我会简单的做一个示例,让大家对其有所了解!如果做Freemarker编程,请好好看看API手册,可以说里面的内容很多!也是一门独立的 ...

  4. freemarker实现自定义指令和自定义函数

    自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...

  5. freemarker自定义标签(一)

    freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...

  6. freemarker自定义标签报错(七)

    1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  7. freemarker自定义标签(二十一)

    一,讲解一 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-equiv=" ...

  8. Freemaker 自定义指令和函数

    自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...

  9. FreeMarker 自定义 TemplateDirectiveModel(一)

    FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...

随机推荐

  1. 【第十八篇】- Maven Eclipse之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven Eclipse Eclipse 提供了一个很好的插件 m2eclipse ,该插件能将 Maven 和 Eclipse 集成在一起. 在最新的 Eclipse 中自带了 Maven,我们打 ...

  2. VS Code + WSL 搭建 RaspberryPi Pico 开发环境

    前面老周写一堆 .NET 与树莓派相关的水文.其实使用的是.net的 IOT 库,并不只是树莓派,其他运行 Linux 的开发板都适用,只要有 GPIO 就行.老周好像在哪看到过,有 USB 转GPI ...

  3. PHP的那些魔术方法(一)

    在PHP中,有一堆魔术方法,服务于类和对象.PHP虽然也是纯种的面向对象语言,但是之前的PHP还真不是,所以有一些面向对象的标准实现并不完善,比如重载.但是,我们可以通过一些魔术方法来弥补,例如__c ...

  4. centos7.6,nginx1.18,php-7.4.6,mysql-5.7.30 安装

    #1.下载,来自各官网 nginx-1.18.0.tar.gz php-7.4.6.tar.gz mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz #下载到本地再传 ...

  5. js屏蔽右键代码

    <script type="text/javascript"> document.body.oncontextmenu=document.body.ondragstar ...

  6. ecshop增加调用字段问题汇总

    一.ecshop文章列表页调用缩略图.网页描述等 打开includes/lib_article.php文件,大约在69行 添加 $arr[$article_id]['description'] = $ ...

  7. Python测试框架对比----unittest, pytest, nose, robot framework对比

    什么是框架? 框架(Framework)是整个或部分系统的可重用设计, 框架是用来解决代码的组织及运行控制问题的. 在我们编写自动化脚本的时候,经常需要读取配置文件,读取数据文件,发送请求,记录日志, ...

  8. javascript 责任链模式 Chain of Responsibility

    * 可拆分的责任链节点 // 可拆分的责任链节点 // Chain.prototype.setNextSuccessor 指定在链条中的下一个节点 // Chain.prototype.passReq ...

  9. javascript 字符串 数字反转 字母大小写互换

    // 符串abcd123ABCD456 怎么转换为 ABCD321abcd654 // 数字要倒序 小写转大写, 大写转小写 Array.prototype.reverse = function() ...

  10. Jmeter监控技术实战

    性能测试中监控的意义 为性能分析提供依据 监控方案 serverAgent jmeter的插件,监控颗粒度不高,界面简陋 服务器中启动 jmeter中添加插件 Nmon Grafana 优秀监控方案所 ...