Browse Source

feat: 敏感词改为从数据库中拉取

master
xsx 2 years ago
parent
commit
d1bfe1251a
  1. 50
      im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java
  2. 16
      im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java
  3. 22
      im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java
  4. 30
      im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java
  5. 49
      im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
  6. 3
      im-platform/src/main/resources/sensitive-words.txt

50
im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java

@ -0,0 +1,50 @@
package com.bx.implatform.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 敏感词
*
* @author Blue
* @since 1.0.0 2024-07-20
*/
@Data
@TableName("im_sensitive_word")
public class SensitiveWord {
/**
* id
*/
@TableId
private Long id;
/**
* 敏感词内容
*/
private String content;
/**
* 是否启用
*/
private Boolean enabled;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private Long creator;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
}

16
im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java

@ -0,0 +1,16 @@
package com.bx.implatform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bx.implatform.entity.SensitiveWord;
import org.apache.ibatis.annotations.Mapper;
/**
* 敏感词
*
* @author Blue
* @since 1.0.0 2024-07-20
*/
@Mapper
public interface SensitiveWordMapper extends BaseMapper<SensitiveWord> {
}

22
im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java

@ -0,0 +1,22 @@
package com.bx.implatform.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bx.implatform.dto.LoginDTO;
import com.bx.implatform.dto.ModifyPwdDTO;
import com.bx.implatform.dto.RegisterDTO;
import com.bx.implatform.entity.SensitiveWord;
import com.bx.implatform.entity.User;
import com.bx.implatform.vo.LoginVO;
import com.bx.implatform.vo.OnlineTerminalVO;
import com.bx.implatform.vo.UserVO;
import java.util.List;
public interface SensitiveWordService extends IService<SensitiveWord> {
/**
* 查询所有开启的敏感词
* @return
*/
List<String> findAllEnabledWords();
}

30
im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java

@ -0,0 +1,30 @@
package com.bx.implatform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bx.implatform.entity.SensitiveWord;
import com.bx.implatform.mapper.SensitiveWordMapper;
import com.bx.implatform.service.SensitiveWordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class SensitiveWordServiceImpl extends ServiceImpl<SensitiveWordMapper, SensitiveWord> implements
SensitiveWordService {
@Override
public List<String> findAllEnabledWords() {
LambdaQueryWrapper<SensitiveWord> wrapper = Wrappers.lambdaQuery();
wrapper.eq(SensitiveWord::getEnabled,true);
wrapper.select(SensitiveWord::getContent);
List<SensitiveWord> words = this.list(wrapper);
return words.stream().map(SensitiveWord::getContent).collect(Collectors.toList());
}
}

49
im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java

@ -1,29 +1,30 @@
package com.bx.implatform.util; package com.bx.implatform.util;
import cn.hutool.core.util.StrUtil;
import com.bx.imcommon.util.ThreadPoolExecutorFactory;
import com.bx.implatform.service.SensitiveWordService;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.CharUtils; import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* 敏感词过滤器SensitiveFilter * 敏感词过滤器SensitiveFilter
* *
* @author Andrews * @author Andrews
* @date 2023/12/4 11:12 * @date 2023/12/4 11:12
* @return null
*/ */
@Slf4j @Slf4j
@Component @Component
@NoArgsConstructor @RequiredArgsConstructor
public final class SensitiveFilterUtil { public final class SensitiveFilterUtil {
/** /**
@ -36,12 +37,19 @@ public final class SensitiveFilterUtil {
*/ */
private static final TrieNode ROOT_NODE = new TrieNode(); private static final TrieNode ROOT_NODE = new TrieNode();
/**
* 线程池
*/
private static final ScheduledThreadPoolExecutor EXECUTOR_SERVICE =
ThreadPoolExecutorFactory.getThreadPoolExecutor();
private final SensitiveWordService sensitiveWordService;
/** /**
* 1 前缀树 前缀树某一个节点 * 1 前缀树 前缀树某一个节点
* *
* @author NXY * @author NXY
* @date 2023/12/4 11:17 * @date 2023/12/4 11:17
* @return null
*/ */
private static class TrieNode { private static class TrieNode {
// 关键词结束标识 // 关键词结束标识
@ -79,18 +87,16 @@ public final class SensitiveFilterUtil {
*/ */
@PostConstruct @PostConstruct
public void init() { public void init() {
try { // 每120s装载一次敏感词
// 类加载器 EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt"); List<String> keywords = sensitiveWordService.findAllEnabledWords();
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); keywords.forEach(keyword->{
String keyword; if(StrUtil.isNotEmpty(keyword)){
while ((keyword = reader.readLine()) != null) { // 添加到前缀树
// 添加到前缀树 addKeyword(keyword);
this.addKeyword(keyword); }
} });
} catch (IOException e) { },0,120, TimeUnit.SECONDS);
log.error("加载敏感词文件失败: " + e.getMessage());
}
} }
/** /**
@ -189,10 +195,9 @@ public final class SensitiveFilterUtil {
/** /**
* 判断是否为符号 特殊符号 * 判断是否为符号 特殊符号
* *
* @param c
* @return boolean
* @author NXY * @author NXY
* @date 2023/12/4 11:17 * @date 2023/12/4 11:17
* @return boolean
*/ */
private boolean isSymbol(Character c) { private boolean isSymbol(Character c) {
// 0x2E80~0x9FFF 是东亚文字范围 // 0x2E80~0x9FFF 是东亚文字范围

3
im-platform/src/main/resources/sensitive-words.txt

@ -1,3 +0,0 @@
杀了你
傻逼
去死
Loading…
Cancel
Save