我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

如何实现读取带敏感字符的行的批处理

这篇文章主要介绍了如何实现读取带敏感字符的行的批处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:@echo off :: 普通的 for+findstr 语句会忽
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录