利用Jackson的JsonFilter来实现动态过滤数据列(数据列权限控制)
利用Jackson的JsonFilter来实现动态过滤数据列。
也就是说,同一个实体,你配置了不同的@JsonFilter,通过Jackson展现的结果可以是不一样的。
举个栗子:
@lombok.Data
public class User{String username;String password;Integer age;String gender;String blog;
}
默认不做任何配置的话,通过Jackson序列化出来的结果是:
{"username" : "tomcatandjerry","password" : "123456","age" : 36,"gender" : "男","blog" : "http://www.cnblogs.com/tomcatandjerry/"
}
可是password不应该要展示,方法有多种:
方法1:在不想序列化的字段上加注解JsonProperty:
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)//Jackson
@JSONField(serialize = false)//fastjson
String password;
方法2:
2.1在User类上面加注解JsonFilter:
@JsonFilter("non-password")
public class User {...
}
2.2 配置FilterProvider
测试方法&配置如下:
public class JsonFilterTest {private ObjectMapper setupJsonFilter(){ObjectMapper mapper = new ObjectMapper();String[] beanProperties = new String[]{"password"};String nonPasswordFilterName = "non-password";//需要跟User类上的注解@JsonFilter("non-password")里面的一致FilterProvider filterProvider = new SimpleFilterProvider().addFilter(nonPasswordFilterName, SimpleBeanPropertyFilter.serializeAllExcept(beanProperties));//serializeAllExcept 表示序列化全部,除了指定字段//filterOutAllExcept 表示过滤掉全部,除了指定的字段mapper.setFilterProvider(filterProvider);return mapper;}@Testpublic void testJsonFilter() throws JsonProcessingException {User user = new User();user.setUsername("tomcatandjerry");user.setPassword("123456");user.setAge(36);user.setGender("男"); System.out.println(setupJsonFilter().writeValueAsString(user));}
}
打印测试结果:
{"username" : "tomcatandjerry","age" : 36,"gender" : "男","blog" : "http://www.cnblogs.com/tomcatandjerry/"
}
小结:
看上去似乎使用@JsonProperty更简单。
但是当有一堆字段需要配置,而且整个项目都需要统一处理的时候,后者@JsonFilter是一个不错的选择。
扩展:
同一个API,如果我想不同的人看到不一样的结果呢?
比如同一个用户API,有的展示username+age, 有的展示username+gender等
这个时候JsonFilter就非常适合了。
有人可能会问:不对啊?一个对象只能配置一个JsonFilter,怎么动态切换不同的Filter?
对的,一个对象只能配置一个JsonFilter,但只要稍加修改,就能实现??
思路:
既然一个对象只能配置一个JsonFilter,那么靠一个对象来动态展示不同的属性是不可能的。
我们可以多写几个对象,都继承User对象,不同的子类里面使用不同的JsonFilter
@JsonFilter("normal-user")
public class UserNormal extends User{//空class,里面没有任何属性
}@JsonFilter("admin")
public class UserAdmin extends User{//空class,里面没有任何属性
}
利用Spring的切点,根据当前用户的角色,替换返回值为不同的子类
原本:
public class UserService{public User get(String id){}
}
利用切点(可以自定义注解,加到方法上,切在注解上面),替换返回的对象为子类:
具体需要用到的:
- 扫描并缓存子类
- @Aspect切点,@Around(value=“比如:自定义注解”)
- 利用反射,创建出子类对象,BeanUtils.copyProperties
这样看似调用userService.get(“id”)返回的是User对象,其实可能已经替换成某一个子类了。
在ObjectMapper配置多个Filter,就实现了动态展示不同属性,且对开发人员透明。
小结:
优点: 对开发透明
缺点:一个对象需要写多个子类,虽然是空class
这也算是一种数据列权限控制的一种解决方案吧。
利用Jackson的JsonFilter来实现动态过滤数据列(数据列权限控制)相关推荐
- 如何利用 C# 爬取带 Token 验证的网站数据?
在对文本数据的情感分析中,基于情感词典的方法是最简单也是最常用的一种了. 它的大体思路如下: 对文档分词,找出文档中的情感词.否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前 ...
- 神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据
本文讲的是神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据,近日,一组以色列研究人员设计了一种新技术,可以利用扫描仪通过受控恶意软件在气隙系统(air-gapped)中获取用户设备中的数据. 关 ...
- 【思维导图】利用LSTM(长短期记忆网络)来处理脑电数据
文章来源| 脑机接口社区群友 认知计算_茂森的授权分享 在此非常感谢 认知计算_茂森! 本篇文章主要通过思维导图来介绍利用LSTM(长短期记忆网络)来处理脑电数据. 文章的内容来源于社区分享的文章&l ...
- 利用LSTM(长短期记忆网络)来处理脑电数据
目录 LSTM 原理介绍 LSTM的核心思想 一步一步理解LSTM 代码案例 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 Rose小哥今天介绍一下用LS ...
- 利用partition分组查询 查询每个分组第一条数据
利用partition分组查询 查询每个分组第一条数据 数据库:sqlserver (其他数据库没有尝试) row_number() over(partition by year(createtime ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 转载于:https://www.cnblogs.com/jing1617/p/7009122.html
- Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换
Py之pandas:利用where.replace等函数对dataframe格式数据按照条件进行数据替换 目录 利用where.replace等函数对dataframe格式数据按照条件进行数据替换 利 ...
- ML之xgboost:利用xgboost算法对Boston(波士顿房价)数据集【特征列分段→独热编码】进行回归预测(房价预测)+预测新数据得分
ML之xgboost:利用xgboost算法对Boston(波士顿房价)数据集[特征列分段→独热编码]进行回归预测(房价预测)+预测新数据得分 导读 对Boston(波士顿房价)数据集进行特征工程,分 ...
- java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...
Mysql load data的使用 数据库中,最常见的写入数据方式是通过SQL INSERT来写入,另外就是通过备份文件恢复数据库,这种备份文件在MySQL中是SQL脚本,实际上执行的还是在批量IN ...
最新文章
- ValueError: max() arg is an empty sequence
- 2020人工神经网络第一次作业-解答第一部分
- wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)
- 应用分析:CIO须注意SOA使用中的五大隐患
- 将数据转化为API,OpenDataSoft获540万美元A轮融资
- 相关的类代表的颜色和文本对齐方式
- 仅仅有人物没背景的图片怎么弄_五分钟写作课 人物篇 人物的出场是个关键时刻...
- 在 Java 中初始化 List 的五种方法
- L3-020 至多删三个字符 [DP]
- python集合类型运算符_Python 数据类型和运算符
- 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(DP)
- [题解] 2038: [2009国家集训队]小Z的袜子(hose)
- 计算机组成原理期末复习整理 白中英版本
- 车牌识别easypr的详细介绍
- 原生Android用不了電信4g,给初中生准备的手机,在深圳地区用中国电信4G体验多亲Qin2 AI助手,开箱和使用体验...
- Android透明字体画法
- 【JavaScript】相关知识学习笔记
- 怎么验证mysql安装成功_mysql如何验证是否安装成功
- 洛谷1268树的重量(树)
- 缺少dll文件怎么办?修复dll文件的多种方法