freemarker自定义指令
最近项目中使用了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>auth auth="03";loopVar01,loopVar02>
我可以出来,获取到后台返回${loopVar01}<br/>
<#list loopVar02 as loop>
per : ${loop_index}-${loop}
</#list>
</@auth>
<@auth auth="01">
因为我没有这个权限,所以出不来
</@auth>
我可以出来,获取到后台返回${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自定义指令的更多相关文章
- 基于SSM3框架FreeMarker自定义指令(标签)实现
通过之前的Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解系列文章,我们已经成功的整合到了一起,这次大象将在此基础上对框架中的FreeMarker模板 ...
- freemarker自定义标签(三)-nested指令
freemarker自定义标签 1.nested指令 是可选的,可以在<#macro>和</#macro>之间使用在任何位置和任意次数 2.示例说明 <#macro ta ...
- [freemarker篇]06.超级强大的自定义指令
Freemarker的自定义指令是很强大的,非常强大,在之后的教程中我会简单的做一个示例,让大家对其有所了解!如果做Freemarker编程,请好好看看API手册,可以说里面的内容很多!也是一门独立的 ...
- freemarker实现自定义指令和自定义函数
自定义指令: 1.指令在前台实现 <#macro name param1,param2,param3...paramN> </#macro> 2.指令在后台实现 1.实现Tem ...
- freemarker自定义标签(一)
freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...
- freemarker自定义标签报错(七)
1.错误描述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- freemarker自定义标签(二十一)
一,讲解一 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-equiv=" ...
- Freemaker 自定义指令和函数
自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...
- FreeMarker 自定义 TemplateDirectiveModel(一)
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...
随机推荐
- JS011. 身份证号码校验(仅34行)
身份证格式 六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位数字校验码 checkIdCard.js checkIdCard: function (idCard){ //15位和1 ...
- js实现钟表
在网页上显示一个钟表 html: <body onload="startTime()"> <div id="txt"></div& ...
- 前端--jstree--异步加载数据
利用回调来处理服务器返回的数据, 默认只能解析固定格式的返回值 <div class=""> <div id="div-jstree"> ...
- k8s 部署elasticsearch报 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
1.由于登不上云的节点 不采用修改节点配置的方式 修改部署的stateful 加上 initContainers 它和 containers 同一层级的 initContainers: - name: ...
- 修改statefulset 有些不允许直接修改
1.比如修改一个storageClassName: hostpath 会报错 意思是除了 'replicas', 'template', 'updateStrategy' 其他部分都是不可以 ...
- SpringMVC执行流程总结
SpringMVC 执行流程: 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到请求调用处理映射器 HandlerMapping 处理映射器根据请 ...
- vue-cli 项目中使用 v-chart 及导出 chart 图片
安装: npm i v-charts echarts -S 组件中使用: 1 <template> 2 <div class="app-chart"> 3 ...
- FastAPI(7)- get 请求 - 详解 Path
前言 上一篇讲了可以为查询参数添加额外的校验和元数据,Query 库:https://www.cnblogs.com/poloyy/p/15306809.html 这篇讲可以为路径查询添加额外的校验和 ...
- 记一次 .NET 某上市工业智造 CPU+内存+挂死 三高分析
一:背景 1. 讲故事 上个月有位朋友加wx告知他的程序有挂死现象,询问如何进一步分析,截图如下: 看这位朋友还是有一定的分析基础,可能玩的少,缺乏一定的分析经验,当我简单分析之后,我发现这个dump ...
- Java基础系列(9)- 数据类型扩展及常见面试题
整数拓展 // 整数拓展: 进制 二进制0b 十进制 八进制0 十六进制0x // 同一个数字在不同进制中,结果是不同的,进制换算 int i = 10; int i2 = 010; // 八进制 i ...