业务场景
业务最近提出一个需求,业务中的价格字段,如果没权限看见就显示***。有权限看见则显示正常数组
如下:
有权限显示的为正常的json串
{
······
"goodsName": "铜器不是的",
"collectPrice": "1000"
}
无权限则显示 *****
{
"goodsName": "铜器不是的",
"collectPrice": "*****"
}
技术实现难点分析
1.此字段是基础字段,在大量接口中使用,且返回值未做约束,进行单个业务修改工作,则修改工作量过大,且一旦漏掉,对业务存在风险。
2.此字段的访问权限为单独的权限,和接口等权限需要做分离。
3.因为是基础字段,所以字段名在各个实体类中是保持一致的
实现思路
首先我们明白前后端发送请求和返回响应时需要进行序列化和反序列化,那我们是否可以在序列化时进行自定义业务改造,实现在序列化。
查询fastJson,发现提供全局配置,进行序列化和反序列化时的自定义装配。尝试实现后,完成本次需求。
解决代码
直接上图:
全局自定义装配
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
···························
//新增自定义过滤器
CollectPriceJsonFilter filter = new CollectPriceJsonFilter();
config.setSerializeFilters(filter);
······························
}
/**
*自定义过滤器实现
**/
public class CollectPriceJsonFilter implements ValueFilter {
@Override
public Object process(Object o, String s, Object o1) {
if ("collectPrice".equals(s)) {
//判断是否有显示的权限
List<String> elPermissions = SecurityUtils.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
//核心判断,无权限则将此字段置为****
if (!elPermissions.contains("admin") && !elPermissions.contains("collectPrice:show")) {
return "*****";
}
}
return o1;
}
}
打完收工,总结,遇到问题多思考。
我是和弦,如果对你有用,不妨一键三连