电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Boot 實(shí)現(xiàn)敏感詞及特殊字符過(guò)濾處理

瀏覽:2日期:2023-07-05 16:36:49
背景:

技術(shù)采用的是 Spring Boot ,請(qǐng)求方法主要為 POST, 請(qǐng)求使用較多的注解為 @RequestBody

交付測(cè)試人員進(jìn)行測(cè)試,測(cè)試人員在對(duì)模糊搜索模塊進(jìn)行了各種特殊字符的搜索,以至于敏感詞和特殊字符均會(huì)入庫(kù)。

對(duì)于我這樣有情懷的開發(fā)者而言,是不能容忍的。

上來(lái)就是干!主要采用

@ControllerAdvice(basePackages = 'com.my')

的方式,對(duì)用戶提交的數(shù)據(jù)做處理。

以下是示例代碼,不影響筆者要言表的功能實(shí)現(xiàn):

/** * @author Ryan * @date 2019/4/25 18:41 */@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; }}

由于我們主要針對(duì)提交的數(shù)據(jù)做處理,主要入口在 SensitiveWordUtils.apply(o); 這里的 “Object ” 參數(shù),其實(shí)也就是我們 Controller 方法參數(shù)中,打了 @RequestBody 的實(shí)體。我們可以直接在這里,使用一些手段做處理即可。

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

1. 字符串替換;

2. 自定義拋出運(yùn)行時(shí)異常;

這樣做的另外一個(gè)好處就是,可以在這里統(tǒng)一管理敏感詞。

如果你使用 replaceAll 的話,統(tǒng)一管理上就比較費(fèi)勁了。

最后,筆者把自己寫的反射放在下面,僅供參考,敏感詞替換部分寫了一個(gè)“測(cè)試“ 作為要替換入口的標(biāo)記。

歡迎各界大佬來(lái)扶正!

import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;/** * @author Ryan * @date 2019/4/26 12:40 */public class SensitiveWordUtils { /** * @param result * @return */ public static Object apply(Object result) {if (result == null) { return null;}objectParse(result);return result; } /** * @param obj */ 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; } /** * @param obj * @param field * @param clazz */ 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, '測(cè)試'); } else if (clazz == Map.class) {Map map = (Map)param;for (Object o : map.keySet()) { objectParse(o);} }} catch (IllegalAccessException e) { e.printStackTrace();} } /** * * @param object * @param field * @param param * @throws IllegalAccessException */ 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 還有很大的優(yōu)化點(diǎn),我在這里沒有目前只是看看效果,寫的很粗糙,望大神不要噴。

讀者自行實(shí)現(xiàn)一下,我說(shuō)一下優(yōu)化點(diǎn):

1. 緩存 object 的 String.class 類型的 Field 或者 methodName; 在第一次加載的時(shí)候,緩存進(jìn)去;放到 ConcurrentHashMap<ObjectType, List<StringField>> , 是不是感覺清爽了好多;

2. 過(guò)濾出來(lái) String 類型的 Field ,其他的類型酌情考慮;

3. 等臣妾的再想想;

Spring Boot 統(tǒng)一敏感詞過(guò)濾 demo

對(duì)象序列化前的處理

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

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

中進(jìn)行對(duì)象數(shù)據(jù)的轉(zhuǎn)換。

@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; } /** * 只支持自定義類型數(shù)據(jù)的敏感詞過(guò)濾,考慮遞歸性能 */ 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(); }} }}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 工业CT-无锡璟能智能仪器有限公司| 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 温州富欧金属封头-不锈钢封头厂家| 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 隆众资讯-首页_大宗商品资讯_价格走势_市场行情 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 余姚生活网_余姚论坛_余姚市综合门户网站| sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 防爆电机_ybx3系列电机_河南省南洋防爆电机有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 物流公司电话|附近物流公司电话上门取货 | 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 | 楼承板-开口楼承板-闭口楼承板-无锡海逵| 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 传动滚筒_厂家-淄博海恒机械制造厂 |