日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot项目实现敏感词汇过滤

發布時間:2023/12/10 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot项目实现敏感词汇过滤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄背景:SpringBoot項目實現敏感詞匯過濾

一:敏感詞匯文件放置位置


二:說明:如果txt文件不能編譯,pom文件添加下面配置

<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources></build>

三:簡單的內存緩存敏感詞匯類

public class Cache {/*** 鍵值對集合*/private final static ConcurrentHashMap<String, List<String>> MAP = new ConcurrentHashMap<>();/*** 添加緩存 */public synchronized static void put(String key, List<String> data) {//清除原鍵值對Cache.remove(key);//不設置過期時間MAP.put(key, data);}/*** 讀取緩存 */public static List<String> get(String key) {return MAP.get(key);}/*** 清除緩存*/public synchronized static void remove(String key) {MAP.remove(key);} }

四:敏感詞匯過濾替換為*

package cloud.exec.common.wordfilterutils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; /*** 敏感詞匯過濾替換為** 說明:部分代碼來源于互聯網*/ @Slf4j public class WordFilter {private final static String WORDS = "WORDS";private final static String REPLACE_CHAR = "*";private static HashMap sensitiveWordMap;/** * 最小匹配規則 */private static int minMatchTYpe = 1;/** * 最大匹配規則 */private static int maxMatchType = 2;/*** 敏感詞匯過濾替換為* ** @param text 待檢測文字* @return 替換后文字*/public static String replaceWords(String text) {if (StringUtils.isBlank(text)) {return text;}//緩存獲取敏感詞匯原記錄List<String> words = Cache.get(WORDS);if (CollectionUtils.isEmpty(words)) {//讀取敏感詞匯文件,存入緩存words = readWordsFile();Cache.put(WORDS, words);}if (CollectionUtils.isEmpty(words)) {return text;}//屏蔽敏感詞匯return WordFilter.replaceSensitiveWord(words, text, WordFilter.minMatchTYpe);}/*** 讀取敏感詞匯文件*/private static List<String> readWordsFile() {List<String> list = new ArrayList<>();InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader bufferedReader = null;try {Resource resource = new DefaultResourceLoader().getResource("classpath:words.txt");inputStream = resource.getInputStream();inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);bufferedReader = new BufferedReader(inputStreamReader);String txt = "";while (StringUtils.isNotBlank(txt = bufferedReader.readLine())) {list.addAll(Arrays.asList(StringUtils.split(StringUtils.deleteWhitespace(StringUtils.replace(txt, ",", ",")),",")));}bufferedReader.close();inputStreamReader.close();inputStream.close();} catch (Exception e) {log.error("讀取敏感詞匯文件出錯", e);} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (inputStreamReader != null) {inputStreamReader.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {log.error("讀取敏感詞匯文件出錯", e);}}return list;}/*** 替換敏感字字符** @param data 敏感字集合* @param txt 待檢查文本* @param matchType 匹配規則*/private static String replaceSensitiveWord(List<String> data, String txt, int matchType) {if (sensitiveWordMap == null) {addSensitiveWord(data);}String resultTxt = txt;//獲取所有的敏感詞List<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {resultTxt = resultTxt.replaceAll(iterator.next(), REPLACE_CHAR);}return resultTxt;}/*** 讀取敏感詞庫,將敏感詞放入HashSet中,構建一個DFA算法模型:* 說明:該方法來源于互聯網*/private static void addSensitiveWord(List<String> datas) {sensitiveWordMap = new HashMap(datas.size());Iterator<String> iterator = datas.iterator();Map<String, Object> now = null;Map now2 = null;while (iterator.hasNext()) {now2 = sensitiveWordMap;String word = iterator.next().trim(); //敏感詞for (int i = 0; i < word.length(); i++) {char key_word = word.charAt(i);Object obj = now2.get(key_word);if (obj != null) { //存在now2 = (Map) obj;} else { //不存在now = new HashMap<String, Object>();now.put("isEnd", "0");now2.put(key_word, now);now2 = now;}if (i == word.length() - 1) {now2.put("isEnd", "1");}}}}/*** 獲取內容中的敏感詞*說明:該方法來源于互聯網* @param text 內容* @param matchType 匹配規則 1=不最佳匹配,2=最佳匹配* @return*/private static List<String> getSensitiveWord(String text, int matchType) {List<String> words = new ArrayList<String>();Map now = sensitiveWordMap;int count = 0; //初始化敏感詞長度int start = 0; //標志敏感詞開始的下標for (int i = 0; i < text.length(); i++) {char key = text.charAt(i);now = (Map) now.get(key);if (now != null) { //存在count++;if (count == 1) {start = i;}if ("1".equals(now.get("isEnd"))) { //敏感詞結束now = sensitiveWordMap; //重新獲取敏感詞庫words.add(text.substring(start, start + count)); //取出敏感詞,添加到集合count = 0; //初始化敏感詞長度}} else { //不存在now = sensitiveWordMap;//重新獲取敏感詞庫if (count == 1 && matchType == 1) { //不最佳匹配count = 0;} else if (count == 1 && matchType == 2) { //最佳匹配words.add(text.substring(start, start + count));count = 0;}}}return words;}public WordFilter() {super();} }

五:測試

總結

以上是生活随笔為你收集整理的SpringBoot项目实现敏感词汇过滤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。