广告
返回顶部
首页 > 资讯 > 精选 >Spring Boot如何实现敏感词及特殊字符过滤处理
  • 506
分享到

Spring Boot如何实现敏感词及特殊字符过滤处理

2023-06-20 11:06:26 506人浏览 薄情痞子
摘要

这篇文章主要介绍“Spring Boot如何实现敏感词及特殊字符过滤处理”,在日常操作中,相信很多人在spring Boot如何实现敏感词及特殊字符过滤处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr

这篇文章主要介绍“Spring Boot如何实现敏感词及特殊字符过滤处理”,在日常操作中,相信很多人在spring Boot如何实现敏感词及特殊字符过滤处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring Boot如何实现敏感词及特殊字符过滤处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

背景:

技术采用的是 Spring Boot ,请求方法主要为 POST, 请求使用较多的注解为 @RequestBody

交付测试人员进行测试,测试人员在对模糊搜索模块进行了各种特殊字符的搜索,以至于敏感词和特殊字符均会入库。

对于我这样有情怀的开发者而言,是不能容忍的。

上来就是干!主要采用

@ControllerAdvice(basePackages = "com.my")

的方式,对用户提交的数据做处理。

以下是示例代码,不影响笔者要言表的功能实现:

@ControllerAdvice(basePackages = "com.ytkj")public class EscapeSensitiveWordFilter implements RequestBodyAdvice {    @Override    public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {        return true;    }    @Override    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws ioException {        return inputMessage;    }    @Override    public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {        if(o != null){            SensitiveWordUtils.apply(o);        }        return o;    }    @Override    public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {        return o;    }}

由于我们主要针对提交的数据做处理,主要入口在 SensitiveWordUtils.apply(o); 这里的 “Object ” 参数,其实也就是我们 Controller 方法参数中,打了 @RequestBody 的实体。我们可以直接在这里,使用一些手段做处理即可。

这里的手段,也只能使用反射了(如果读者有什么好的方案可以告诉我)。

字符串替换;

自定义抛出运行时异常;

这样做的另外一个好处就是,可以在这里统一管理敏感词。

如果你使用 replaceAll 的话,统一管理上就比较费劲了。

最后,笔者把自己写的反射放在下面,仅供参考,敏感词替换部分写了一个“测试“ 作为要替换入口的标记。

欢迎各界大佬来扶正!

import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;public class SensitiveWordUtils {        public static Object apply(Object result) {        if (result == null) {            return null;        }        objectParse(result);        return result;    }        public static void objectParse(Object obj) {        List<Field> allField = findAllField(obj);        for (Field field : allField) {            field.setAccessible(true);            Class<?> typeClazz = field.getType();            matchFieldType(obj, field, typeClazz);        }    }    public static List<Field> findAllField(Object object){        List<Field> result = new ArrayList<>();        Class<?> clazz = object.getClass();        while (true) {            clazz = clazz.getSuperclass();            if (clazz == Object.class) {                break;            }            Field[] declaredFields = clazz.getDeclaredFields();            result.addAll(Arrays.asList(declaredFields));        }        return result;    }        public static <T> void matchFieldType(Object obj, Field field, T clazz) {        try {            T param = (T) field.get(obj);            if(param == null){                return;            }            if (clazz == List.class) {                List p = (List)param;                for (Object o : p) {                    objectParse(o);                }            } else if (clazz == String.class) {                setValue(obj, field, "测试");            } else if (clazz == Map.class) {                Map map = (Map)param;                for (Object o : map.keySet()) {                    objectParse(o);                }            }        } catch (IllegalAccessException e) {            e.printStackTrace();        }    }        public static void setValue(Object object, Field field, Object param) throws IllegalAccessException {        if(!field.isAccessible()){            throw new IllegalAccessException("modify the field fail.");        }        field.set(object, param);    }}

这里的 SensitiveWordUtils 还有很大的优化点,我在这里没有目前只是看看效果,写的很粗糙,望大神不要喷。

读者自行实现一下,我说一下优化点:

缓存 object 的 String.class 类型的 Field 或者 methodName; 在第一次加载的时候,缓存进去;放到 ConcurrentHashMap<ObjectType, List<StringField>> , 是不是感觉清爽了好多;

过滤出来 String 类型的 Field ,其他的类型酌情考虑;

等臣妾的再想想;

Spring Boot 统一敏感词过滤 demo

对象序列化前的处理

例如springframework框架(responseBody)JSON 格式:

org.springframework.WEB.servlet.mvc.method.annotation.RequestResponseBodyAdviceChain#beforeBodyWrite

中进行对象数据的转换。

@ControllerAdvice@Slf4jpublic class ShanDongShengYuHandler implements ResponseBodyAdvice {     @Autowired    private ObjectMapper objectMapper;     @Override    public boolean supports(MethodParameter returnType, Class converterType) {        return true;    }     @Override    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {        ResponseData d = new ResponseData();        sensitiveHidden(body);        d.setData(body);        return d;    }          private void sensitiveHidden(Object body) {        if(body==null || StringUtils.isBlank(body.getClass().getName()) || !body.getClass().getName().contains("山东")){            return;        }        Field[] declaredFields = body.getClass().getDeclaredFields();        for (Field declaredField : declaredFields) {            SensitiveWorldHidden annotation = declaredField.getAnnotation(SensitiveWorldHidden.class);            log.warn("【注解类型】{}",annotation);            try {                declaredField.setAccessible(true);                Object o = declaredField.get(body);                if(annotation != null) {                    String content = objectMapper.writeValueAsString(o);                    content = content.replace("垃圾", "**");                    Object replaced = objectMapper.readValue(content, o.getClass());                    declaredField.set(body, replaced);                }else {                    sensitiveHidden(o);                }            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (jsonProcessingException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

到此,关于“Spring Boot如何实现敏感词及特殊字符过滤处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Spring Boot如何实现敏感词及特殊字符过滤处理

本文链接: https://www.lsjlt.com/news/296533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Boot 实现敏感词及特殊字符过滤处理
    背景: 技术采用的是 Spring Boot ,请求方法主要为 POST, 请求使用较多的注解为 @RequestBody 交付测试人员进行测试,测试人员在对模糊搜索模块进行了各种特...
    99+
    2022-11-12
  • Spring Boot如何实现敏感词及特殊字符过滤处理
    这篇文章主要介绍“Spring Boot如何实现敏感词及特殊字符过滤处理”,在日常操作中,相信很多人在Spring Boot如何实现敏感词及特殊字符过滤处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr...
    99+
    2023-06-20
  • 如何实现读取带敏感字符的行的批处理
    这篇文章主要介绍了如何实现读取带敏感字符的行的批处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:@echo off :: 普通的 for+findstr 语句会忽...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作