接口返回大量无用或者敏感字段怎么办?

5 篇文章 0 订阅

背景

      地点:xxxx公司会议室

      前端A: 你们后端接口返回的json太复杂啦!我这例只需要用户的真实姓名和年龄就可以了,结果你们返回了我一大串,好几十个字段……

      前端B: 是呀!是呀!身份证信息是敏感的,这里也不需要用,你们竟然也返回了,还有密码都给我们了!幸亏是加密的~

      后端小菜:多余的字段你们不要管就好啦,又不影响你们~,实在不行我拷贝个新对象给你!

      老板在一旁没有说话,皱了下眉头~

 

思考

     🤔接口传输大量无用数据占用带宽资源、影响性能、甚至泄漏敏感信息!拷贝新对象的话,需求多样会很繁琐而且难以维护,有可能写了两个拥有一样属性的对象~

 

设计

    针对接口响应的json做处理,筛选出需要的字段,通过注解的方式实现简单明了的维护,支持“复杂嵌套”、“仅筛选”、”仅排除“。

演示视频demo下载

 

talk is cheap, show me the code

SerializeField
/**
 * @Author l'amour solitaire
 * @Description TODO
 * @Date 2020/8/11 下午8:55
 **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SerializeField {

    Class clazz();

    /**
     * 需要返回的字段
     * @return
     */
    String[] includes() default {};

    /**
     * 需要去除的字段
     * @return
     */
    String[] excludes() default {};
}
MultiSerializeField
/**
 * @Author l'amour solitaire
 * @Description 用于嵌套类情况的二层过滤(本质目的,为了可以二次执行)
 * @Date 2020/8/11 下午8:52
 **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MultiSerializeField {

    Class clazz();

    /**
     * 需要返回的字段
     * @return
     */
    String[] includes() default {};

    /**
     * 需要去除的字段
     * @return
     */
    String[] excludes() default {};
}
MoreSerializeField
/**
 * @Author l'amour solitaire
 * @Description TODO
 * @Date 2020/8/11 下午8:55
 **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MoreSerializeField {
    SerializeField[] value() default {};
}
WebMvcConfig
/**
 * @Author l'amour solitaire
 * @Description TODO
 * @Date 2020/7/16 上午9:53
 **/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        JsonFilterHttpMessageConverter fastConverter = new JsonFilterHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.DisableCircularReferenceDetect);

        // 处理中文乱码问题
        fastConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.APPLICATION_OCTET_STREAM));
        fastConverter.setFastJsonConfig(fastJsonConfig);
        converters.add(fastConverter);
    }

}

测试

    @RequestMapping("jsonFilter")
    @MoreSerializeField({
            @SerializeField(clazz = People.class, includes = {"name", "ext"}),
            @SerializeField(clazz = PeopleExt.class, excludes = {"age"})
    })
    public R getUser() {
        return R.ok(new People().setAddr("杭州").setName("张三")
                .setExt(new PeopleExt().setAge(20).setSex(1))
        );
    }

过滤前响应报文

过滤后响应报文

 

欢迎咨询公众号《小马JAVA》

插件已上传中央仓库,可联系我获取,集成非常简单,无代码入侵,项目源码客通过下方链接下载,尊重知识劳动成果,谢谢!也欢迎大家积极技术讨论,QQ群:132381997

项目源码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA拾贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值