91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot敏感詞過濾及特殊字符過濾的方法

發布時間:2022-02-24 10:02:59 來源:億速云 閱讀:733 作者:iii 欄目:開發技術

本篇內容介紹了“Springboot敏感詞過濾及特殊字符過濾的方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

技術采用的是 SpringBoot ,請求方法主要為 POST,交付測試人員進行測試,測試人員在對模糊搜索模塊進行了各種特殊字符的搜索,以至于敏感詞和特殊字符均會入庫,那么 springboot 敏感詞過濾及特殊字符過濾處理要如何實現呢?

@ControllerAdvice(basePackages = "com.my")

的方式,對用戶提交的數據做處理。

以下是示例代碼,不影響筆者要言表的功能實現:

/*** @author Ryan* @date 2019/4/25 18:41*/@ControllerAdvice(basePackages = "com.ytkj")public class EscapeSensitiveWordFilter implements RequestBodyAdvice {@Overridepublic boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {return true;}@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {return inputMessage;}@Overridepublic Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {if(o != null){SensitiveWordUtils.apply(o);}return o;}@Overridepublic Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {return o;}}

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

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

1. 字符串替換;

2. 自定義拋出運行時異常;

這樣做的另外一個好處就是,可以在這里統一管理敏感詞。

如果你使用 replaceAll 的話,統一管理上就比較費勁了。

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

歡迎各界大佬來扶正!

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, "測試");} 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 還有很大的優化點,我在這里沒有目前只是看看效果,寫的很粗糙,望大神不要噴。

讀者自行實現一下,我說一下優化點:

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

2. 過濾出來 String 類型的 Field ,其他的類型酌情考慮;

3. 等臣妾的再想想;

Spring Boot 統一敏感詞過濾 demo

對象序列化前的處理

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

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

中進行對象數據的轉換。

@ControllerAdvice@Slf4jpublic class ShanDongShengYuHandler implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;} @Overridepublic 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();}}}}

“Springboot敏感詞過濾及特殊字符過濾的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大冶市| 庆元县| 修武县| 嫩江县| 册亨县| 裕民县| 从化市| 江山市| 丹巴县| 彭山县| 紫云| 沁水县| 永德县| 定兴县| 梅河口市| 阿勒泰市| 庄河市| 辽中县| 大安市| 南充市| 麻阳| 松阳县| 满城县| 大连市| 宿迁市| 饶阳县| 北票市| 新源县| 金阳县| 泰顺县| 永靖县| 海南省| 大同市| 织金县| 德惠市| 阿克苏市| 玉林市| 稷山县| 嘉禾县| 高平市| 宁德市|