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

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

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