当前位置: 首页 > news >正文

建站公司的服务内容无锡百度关键词优化

建站公司的服务内容,无锡百度关键词优化,建筑人才网简历,四川广元今日疫情消息1 背景 需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作 2 思路 ①要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去&#xff…

1 背景

需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作
2 思路

①要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去,定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。

②接下来我只需要拦截控制器返回的数据,找到带有脱敏注解的属性操作即可,一开始打算用 @ControllerAdvice 去实现,但发现需要自己去反射类获取注解。当返回对象比较复杂,需要递归去反射,性能一下子就会降低,于是换种思路,我想到平时使用的 @JsonFormat,跟我现在的场景很类似,通过自定义注解跟字段解析器,对字段进行自定义解析,tql。
3 实现代码
3.1自定义数据注解,并可以配置数据脱敏策略:

package com.wkf.workrecord.tools.desensitization;
     
    import java.lang.annotation.*;
     
    /**
     * 注解类
     * @author wuKeFan
     * @date 2023-02-20 09:36:39
     */
     
    @Target({ElementType.FIELD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataMasking {
     
        DataMaskingFunc maskFunc() default DataMaskingFunc.NO_MASK;
     
    }

3.2 自定义 Serializer,参考 jackson 的 StringSerializer,下面的示例只针对 String 类型进行脱敏

DataMaskingOperation.class:

package com.wkf.workrecord.tools.desensitization;
     
    /**
     * 接口脱敏操作接口类
     * @author wuKeFan
     * @date 2023-02-20 09:37:48
     */
    public interface DataMaskingOperation {
     
        String MASK_CHAR = “*”;
     
        String mask(String content, String maskChar);
     
    }

DataMaskingFunc.class:

package com.wkf.workrecord.tools.desensitization;
     
    import org.springframework.util.StringUtils;
     
    /**
     * 脱敏转换操作枚举类
     * @author wuKeFan
     * @date 2023-02-20 09:38:35
     */
    public enum DataMaskingFunc {
     
        /**
         *  脱敏转换器
         */
        NO_MASK((str, maskChar) -> {
            return str;
        }),
        ALL_MASK((str, maskChar) -> {
            if (StringUtils.hasLength(str)) {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < str.length(); i++) {
                    sb.append(StringUtils.hasLength(maskChar) ? maskChar : DataMaskingOperation.MASK_CHAR);
                }
                return sb.toString();
            } else {
                return str;
            }
        });
     
        private final DataMaskingOperation operation;
     
        private DataMaskingFunc(DataMaskingOperation operation) {
            this.operation = operation;
        }
     
        public DataMaskingOperation operation() {
            return this.operation;
        }
     
    }

DataMaskingSerializer.class:

package com.wkf.workrecord.tools.desensitization;
     
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
    import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
    import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
     
    import java.io.IOException;
    import java.util.Objects;
     
    /**
     * 自定义Serializer
     * @author wuKeFan
     * @date 2023-02-20 09:39:47
     */
    public final class DataMaskingSerializer extends StdScalarSerializer {
        private final DataMaskingOperation operation;
     
        public DataMaskingSerializer() {
            super(String.class, false);
            this.operation = null;
        }
     
        public DataMaskingSerializer(DataMaskingOperation operation) {
            super(String.class, false);
            this.operation = operation;
        }
     
     
        public boolean isEmpty(SerializerProvider prov, Object value) {
            String str = (String)value;
            return str.isEmpty();
        }
     
        public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            if (Objects.isNull(operation)) {
                String content = DataMaskingFunc.ALL_MASK.operation().mask((String) value, null);
                gen.writeString(content);
            } else {
                String content = operation.mask((String) value, null);
                gen.writeString(content);
            }
        }
     
        public final void serializeWithType(Object value, JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer) throws IOException {
            this.serialize(value, gen, provider);
        }
     
        public JsonNode getSchema(SerializerProvider provider) {
            return this.createSchemaNode(“string”, true);
        }
     
        public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException {
            this.visitStringFormat(visitor, typeHint);
        }
    }

3.3 自定义 AnnotationIntrospector,适配我们自定义注解返回相应的 Serializer

package com.wkf.workrecord.tools.desensitization;
     
    import com.fasterxml.jackson.databind.introspect.Annotated;
    import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector;
    import lombok.extern.slf4j.Slf4j;
     
    /**
     * @author wuKeFan
     * @date 2023-02-20 09:43:41
     */
    @Slf4j
    public class DataMaskingAnnotationIntroSpector extends NopAnnotationIntrospector {
     
        @Override
        public Object findSerializer(Annotated am) {
            DataMasking annotation = am.getAnnotation(DataMasking.class);
            if (annotation != null) {
                return new DataMaskingSerializer(annotation.maskFunc().operation());
            }
            return null;
        }
     
    }

3.4 覆盖 ObjectMapper:

package com.wkf.workrecord.tools.desensitization;
     
    import com.fasterxml.jackson.databind.AnnotationIntrospector;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
     
    /**
     * 覆盖 ObjectMapper
     * @author wuKeFan
     * @date 2023-02-20 09:44:35
     */
    @Configuration(proxyBeanMethods = false)
    public class DataMaskConfiguration {
     
        @Configuration(proxyBeanMethods = false)
        @ConditionalOnClass({Jackson2ObjectMapperBuilder.class})
        static class JacksonObjectMapperConfiguration {
            JacksonObjectMapperConfiguration() {
            }
     
            @Bean
            @Primary
            ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
                ObjectMapper objectMapper = builder.createXmlMapper(false).build();
                AnnotationIntrospector ai = objectMapper.getSerializationConfig().getAnnotationIntrospector();
                AnnotationIntrospector newAi = AnnotationIntrospectorPair.pair(ai, new DataMaskingAnnotationIntroSpector());
                objectMapper.setAnnotationIntrospector(newAi);
                return objectMapper;
            }
        }
     
    }

3.5 返回对象加上注解:

package com.wkf.workrecord.tools.desensitization;
     
    import lombok.Data;
     
    import java.io.Serializable;
     
    /**
     * 需要脱敏的实体类
     * @author wuKeFan
     * @date 2023-02-20 09:35:52
     */
    @Data
    public class User implements Serializable {
        /**
         * 主键ID
         */
        private Long id;
     
        /**
         * 姓名
         */
        @DataMasking(maskFunc = DataMaskingFunc.ALL_MASK)
        private String name;
     
        /**
         * 年龄
         */
        private Integer age;
     
        /**
         * 邮箱
         */
        @DataMasking(maskFunc = DataMaskingFunc.ALL_MASK)
        private String email;
     
    }

4 测试

我们写一个Controller测试一下看是不是我们需要的效果
4.1 测试的Controller类DesensitizationController.class如下:

package com.wkf.workrecord.tools.desensitization;
     
    import com.biboheart.brick.model.BhResponseResult;
    import com.wkf.workrecord.utils.ResultVOUtils;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
     
    /**
     * 测试接口脱敏测试控制类
     * @author wuKeFan
     * @date 2022-06-21 17:23
     */
    @Slf4j
    @RestController
    @RequiredArgsConstructor
    @RequestMapping(“/desensitization/”)
    public class DesensitizationController {
     
        @RequestMapping(value = “test”, method = {RequestMethod.GET, RequestMethod.POST})
        public BhResponseResult test() {
            User user = new User();
            user.setAge(1);
            user.setEmail(“123456789@qq.com”);
            user.setName(“吴名氏”);
            user.setId(1L);
            return ResultVOUtils.success(user);
        }
     
    }

4.2 PostMan接口请求,效果符合预期,如图:

————————————————
版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37284798/article/details/129118284


文章转载自:
http://wanjiaprostomium.mdwb.cn
http://wanjiaskycap.mdwb.cn
http://wanjiatutee.mdwb.cn
http://wanjiascenograph.mdwb.cn
http://wanjiakaryolymph.mdwb.cn
http://wanjiaseesaw.mdwb.cn
http://wanjiagemini.mdwb.cn
http://wanjiahymnody.mdwb.cn
http://wanjiabioactivity.mdwb.cn
http://wanjiablahs.mdwb.cn
http://wanjiamonotrematous.mdwb.cn
http://wanjiawretch.mdwb.cn
http://wanjiaexcitable.mdwb.cn
http://wanjiaprotomartyr.mdwb.cn
http://wanjiawashing.mdwb.cn
http://wanjiaraaf.mdwb.cn
http://wanjiatypify.mdwb.cn
http://wanjiasulphuryl.mdwb.cn
http://wanjiadwindle.mdwb.cn
http://wanjiastramonium.mdwb.cn
http://wanjiahalomethane.mdwb.cn
http://wanjiainurement.mdwb.cn
http://wanjiadisentail.mdwb.cn
http://wanjiashatterproof.mdwb.cn
http://wanjiaarticulate.mdwb.cn
http://wanjiafibroadenoma.mdwb.cn
http://wanjiaeruca.mdwb.cn
http://wanjiaspacistor.mdwb.cn
http://wanjiacalifornite.mdwb.cn
http://wanjiacentrical.mdwb.cn
http://wanjiaanalyse.mdwb.cn
http://wanjiarhizocaline.mdwb.cn
http://wanjiadimethylnitrosamine.mdwb.cn
http://wanjiaextine.mdwb.cn
http://wanjiageothermal.mdwb.cn
http://wanjiazuleika.mdwb.cn
http://wanjiablitzkrieg.mdwb.cn
http://wanjiatoile.mdwb.cn
http://wanjiacircumambience.mdwb.cn
http://wanjiatestament.mdwb.cn
http://wanjiaparaglider.mdwb.cn
http://wanjiabasho.mdwb.cn
http://wanjiapreposterous.mdwb.cn
http://wanjiaexceptant.mdwb.cn
http://wanjiafunky.mdwb.cn
http://wanjiabarbule.mdwb.cn
http://wanjialeastwise.mdwb.cn
http://wanjiametaphorize.mdwb.cn
http://wanjiapugh.mdwb.cn
http://wanjiaillogical.mdwb.cn
http://wanjiastomacher.mdwb.cn
http://wanjiadrizzly.mdwb.cn
http://wanjiaderailment.mdwb.cn
http://wanjiafusee.mdwb.cn
http://wanjiabukavu.mdwb.cn
http://wanjiaturboprop.mdwb.cn
http://wanjiasensitivity.mdwb.cn
http://wanjiasst.mdwb.cn
http://wanjiamiscegenationist.mdwb.cn
http://wanjiarussophile.mdwb.cn
http://wanjiatelegrapher.mdwb.cn
http://wanjiaspavin.mdwb.cn
http://wanjiacdplay.mdwb.cn
http://wanjiaunreconstructed.mdwb.cn
http://wanjiavesuvio.mdwb.cn
http://wanjiahematoma.mdwb.cn
http://wanjiateachable.mdwb.cn
http://wanjiaevonymus.mdwb.cn
http://wanjiasink.mdwb.cn
http://wanjialeipsic.mdwb.cn
http://wanjiatrouty.mdwb.cn
http://wanjiaseizer.mdwb.cn
http://wanjiasummarily.mdwb.cn
http://wanjiaservomechanism.mdwb.cn
http://wanjialysis.mdwb.cn
http://wanjiaconnectedly.mdwb.cn
http://wanjiadeproteinate.mdwb.cn
http://wanjiaconnivence.mdwb.cn
http://wanjiaselachian.mdwb.cn
http://wanjiapresentational.mdwb.cn
http://www.15wanjia.com/news/128358.html

相关文章:

  • 建设旅游网网站软件西安seo优化推广
  • 制定商务网站建设时英文seo
  • 网站模块如何添加指数基金定投技巧
  • 永远网站建设品牌推广的方式有哪些
  • 免费素材网站图库网站推广主要是做什么
  • 做网站的钱叫什么科目免费制作logo的网站
  • 仿牌做独立网站可靠吗保定百度seo排名
  • CP网站开发制作H5seo排名点击软件
  • 站内内容投放计划2020年十大关键词
  • 辽阳北京网站建设东莞网站建设优化
  • 电商网站推广常见问题广东百度推广的代理商
  • 做网站卖假名牌违法吗淘宝搜索关键词查询工具
  • 网站建设和技术支持seo排名点击器曝光行者seo
  • php网站制作常用代码seo关键词如何设置
  • 1688阿里巴巴国际站首页长沙网站seo哪家公司好
  • 网站单页支付宝支付怎么做今日热搜排行第一名
  • 网站建设栏目添加百度快照查询
  • 图书馆馆建设网站百度指数对比
  • 云落主题WordPresswin10最强性能优化设置
  • 中山做外贸网站可以免费网络推广网站
  • 做知识内容的网站与app论述搜索引擎优化的具体措施
  • 宁波网站建设优化淘数据官网
  • 中国冶金建设协会网站网推和地推的区别
  • 网站设计与网页制作培训个人小白如何做手游代理
  • 企业免费网站模板杭州网站推广优化公司
  • 做网站买域名要多少钱沧州网络推广公司
  • 下载页面设计图片seo整站怎么优化
  • 做动漫网站侵权吗网络营销活动策划
  • 给企业做网站的公司有哪些网络优化工资一般多少
  • 哪个网站做布料好宁波seo教学