1. java 正则过滤字符串穿中的数字开头字符
可以。Java正则表达式:32="1"\s+59="0000"
完整的程序如下:
publicclassLL{
publicstaticvoidmain(String[]args){
Strings="<root><users><userid="2739751"ccted="0000000000"32="1"59="0000"name="张非"></user></users></root>";
System.out.println(s.replaceAll("32="1"\s+59="0000"",""));
}
}
运行结果:
<root><users><user id="2739751" ccted="0000000000" name="张非"></user></users></root>
2. java过滤sql关键字的正则替换掉
java过滤sql关键字的正则替换掉方法如下:
可以在C#中这样做:Regexregex = newRegex(@"]*>[^");
stringcleanedHtml = regex.Replace(html, "");
可是我并不想再写个循环去遍历每条记录,然后保存每条记录,我想在数据库中一步到位,而sql只提供了简单的replace函数,这个函数明显不能达到咱的要求,那就去写一个自定义函数吧。
函数源代码如下:CREATE functiondbo.regexReplace
(@source ntext,--原字符串@regexp varchar(1000),--正则表达式@replace varchar(1000),--替换值@globalReplace bit=1,--是否是全局替换@ignoreCase bit=0 --是否忽略大小写)returnS varchar(1000)AS
begin
declare@hr intege
declare@objRegExp integer
declare@result varchar(5000)exec@hr =sp_OACreate'VBScript.RegExp',@objRegExp OUTPUT
IF@hr <>0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'Pattern',@regexp
IF@hr <>0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'Global',@globalReplace
IF@hr <>0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OASetProperty@objRegExp,'IgnoreCase',@ignoreCase
IF@hr <>0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OAMethod@objRegExp,'Replace',@result OUTPUT,@source,@replace
IF@hr <>0 begin
exec@hr =sp_OADestroy@objRegExp
returnnullend
exec@hr =sp_OADestroy@objRegExp
IF@hr <>0 begin
returnnullend
return@result
end
需要注意的是,即使写好了这个函数,也并不能马上使用。执行这个函数时可能会出现以下的错误:Msg 15281, Level 16, State 1, Line 1
SQL Server blocked access to procere 'sys.sp_OACreate' of component 'Ole Automation Proceres' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Proceres' by using sp_configure. For more information about enabling 'Ole Automation Proceres', see "Surface Area Configuration" in SQL Server Books Online.
这是因为未开启Ole Automation Proceres选项,MSDN中的Ole Automation Proceres选项。执行下面的语句开启这个选项:sp_configure'show advanced options',1;GO
RECONFIGURE;GOsp_configure'Ole Automation Proceres',1;GO
RECONFIGURE;GO
所有的准备工作都已经做好,那就试验一下吧。
Example1:忽略大小写并替换selectdbo.regexReplace(',']*>[^','',1,1)
Example2: 使用贪婪匹配
html代码:
Also Available - Smith & Hogan: Criminal Law Cases & Materials 10th ed
There is, as ever, detailed analysis of the many recent case developments, in particular,
a revision of the chapter dealing with secondary liability and joint enterprise.
调用代码:selectdbo.regexReplace(html,']*>(.|
)*?','',1,1)
Example3:去除html标签selectdbo.regexReplace('
Key Contact:
Mr Jack, Zhou
General Manager
Mr A, Ho
Marketing Director
Overseas Sales
MsWinny, Luo
Sales Manager
Overseas Sales',']*>','',1,0)
Example4:数据库字段值替换updateBooks。
3. 在JAVA中怎么实现关键字过滤
自己判断一下, 字符串中是否包含某个关键字即可, String.contains(CharSequence s) 如果存在返回true, 否则返回false
4. java如何快速过滤掉某个字符串包含的最长的一个词
java快速过滤掉某个字符串包含的最长的一个词方法:把敏感词的第一个字符取出来,作为比较对象。遍历整个字符串,如果发现字符跟敏感词第一个字符相同,就从字符串取出跟关键词相同长度的子串比较,如果相同就替换。本算法比较适合敏感词都不长的场合。Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
5. java怎样过滤危险字符,该怎么解决
就WEB应用来说,所谓危险的字符一般就是两种
一个专是SQL注入属,一个是HTML语法注入
SQL注入主流的框架都可以搞定,JDBC永远都使用preparedstatement就可以防止所有的sql注入,关键是用户输入都要通过占位符往里放,就自动的替换掉了特殊字符了。hibernate等orm框架都会搞定这个问题
HTML语法注入是指用户输入的html代码回显出来,这样如果不转义就可以破坏页面的结构或者注入脚本。所以现在的网站都不允许用户直接输入html代码了,现在都是一些UBB标签来完成一些效果。HTML主要最好的解决办法是在回显的时候进行转义,所有的MVC框架或者展示层框架都有HTML转义的支持,包括struts,spring,volicty等,注意观察他们用于显示的标签
6. java过滤非法字符的filter
filter代码在pujia12345提供的代码上改的;
jsp页面的编码你设成你自己的,我用的是utf-8。
input.jsp输入后,正常跳转到handle.jsp,而禁词已经被过滤。
filter:
package test;
import java.io.*;
import javax.servlet.*;
import java.util.*;
public class MyFilter implements Filter
{
private List<String> unString;
public void init(FilterConfig filterConfig) throws ServletException
{
unString = new ArrayList<String>();
unString.add("日");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
String content = request.getParameter("content");//需要过滤的参数
if(content!=null){
for (int i = 0; i < unString.size(); i++)
{
String strIllegal = unString.get(i);
if (content.indexOf(strIllegal) >= 0)
{
content = content.replaceAll(strIllegal, "");//非法字符替换成空
}
request.setAttribute("content", content);//为request设置属性保存修改后的值
}
}
chain.doFilter(request, response);
}
public void destroy()
{
//System.out.println("过滤器销毁");
}
}
//---------------------------//
web.xml:
<filter>
<filter-name>myfilter</filter-name>
<filter-class>test.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//---------------------------//
输入页面input.jsp:
<%@page contentType="text/html;charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>input.jsp</title>
</head>
<body>
<form action="handle.jsp" method="post">
<input type="text" name="content" />
<input type="submit" value=" 提交 " />
</form>
</body>
</html>
//---------------------------//
input提交的页面handle.jsp:
<%@page contentType="text/html;charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> handle.jsp </title>
</head>
<body>
<%
String content = (String)request.getAttribute("content");
out.println(content);
%>
</body>
</html>
7. Spring Boot + Redis 搞定搜索栏热搜、不雅文字过滤功能
使用java和redis实现一个简单的热搜功能,具备以下功能:
搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录
用户在搜索栏输入某字符,则将该字符记录下来 以zset格式存储的redis中,记录该字符被搜索的个数以及当前的时间戳 (用了DFA算法,感兴趣的自己网络学习吧)
每当用户查询了已在redis存在了的字符时,则直接累加个数, 用来获取平台上最热查询的十条数据。(可以自己写接口或者直接在redis中添加一些预备好的关键词)
最后还要做不雅文字过滤功能。这个很重要不说了你懂的。
代码实现热搜与个人搜索记录功能,主要controller层下几个方法就行了 :
向redis 添加热搜词汇(添加的时候使用下面不雅文字过滤的方法来过滤下这个词汇,合法再去存储
每次点击给相关词热度 +1
根据key搜索相关最热的前十名
插入个人搜索记录
查询个人搜索记录
首先配置好redis数据源等等基础最后贴上核心的 服务层的代码 :
package com.****.****.****.user; import com.jianlet.service.user.RedisService;import org.apache.commons.lang.StringUtils;import org.springframework.data.redis.core.*;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.*;import java.util.concurrent.TimeUnit; /** * @author: wxd * @date: 2022/5/13 * @description: */@Transactional@Service("redisService")public class RedisServiceImpl implements RedisService { //导入数据源@Resource(name = "redisSearchTemplate")private StringRedisTemplate redisSearchTemplate;//新增一条该userid用户在搜索栏的历史记录//searchkey 代表输入的关键词@Overridepublic int addSearchHistoryByUserId(String userid, String searchkey) {String shistory = RedisKeyUtils.getSearchHistoryKey(userid);boolean b = redisSearchTemplate.hasKey(shistory);if (b) {Object hk = redisSearchTemplate.opsForHash().get(shistory, searchkey);if (hk != null) {return 1;}else{redisSearchTemplate.opsForHash().put(shistory, searchkey, "1");}}else{redisSearchTemplate.opsForHash().put(shistory, searchkey, "1");}return 1;} //删除个人历史数据@Overridepublic Long delSearchHistoryByUserId(String userid, String searchkey) {String shistory = RedisKeyUtils.getSearchHistoryKey(userid);return redisSearchTemplate.opsForHash().delete(shistory, searchkey);} //获取个人历史数据列表@Overridepublic List<String> getSearchHistoryByUserId(String userid) {List<String> stringList = null;String shistory = RedisKeyUtils.getSearchHistoryKey(userid);boolean b = redisSearchTemplate.hasKey(shistory);if(b){Cursor<Map.Entry<Object, Object>> cursor = redisSearchTemplate.opsForHash().scan(shistory, ScanOptions.NONE);while (cursor.hasNext()) {Map.Entry<Object, Object> map = cursor.next();String key = map.getKey().toString();stringList.add(key);}return stringList;}return null;} //新增一条热词搜索记录,将用户输入的热词存储下来@Overridepublic int incrementScoreByUserId(String searchkey) {Long now = System.currentTimeMillis();ZSetOperations zSetOperations = redisSearchTemplate.opsForZSet();ValueOperations<String, String> valueOperations = redisSearchTemplate.opsForValue();List<String> title = new ArrayList<>();title.add(searchkey);for (int i = 0, lengh = title.size(); i < lengh; i++) {String tle = title.get(i);try {if (zSetOperations.score("title", tle) <= 0) {zSetOperations.add("title", tle, 0);valueOperations.set(tle, String.valueOf(now));}} catch (Exception e) {zSetOperations.add("title", tle, 0);valueOperations.set(tle, String.valueOf(now));}}return 1;}//根据searchkey搜索其相关最热的前十名 (如果searchkey为null空,则返回redis存储的前十最热词条)@Overridepublic List<String> getHotList(String searchkey) {String key = searchkey;Long now = System.currentTimeMillis();List<String> result = new ArrayList<>();ZSetOperations zSetOperations = redisSearchTemplate.opsForZSet();ValueOperations<String, String> valueOperations = redisSearchTemplate.opsForValue();Set<String> value = zSetOperations.reverseRangeByScore("title", 0, Double.MAX_VALUE);//key不为空的时候 推荐相关的最热前十名if(StringUtils.isNotEmpty(searchkey)){for (String val : value) {if (StringUtils.containsIgnoreCase(val, key)) {if (result.size() > 9) {//只返回最热的前十名break;}Long time = Long.valueOf(valueOperations.get(val));if ((now - time) < 2592000000L) {//返回最近一个月的数据result.add(val);} else {//时间超过一个月没搜索就把这个词热度归0zSetOperations.add("title", val, 0);}}}}else{for (String val : value) {if (result.size() > 9) {//只返回最热的前十名break;}Long time = Long.valueOf(valueOperations.get(val));if ((now - time) < 2592000000L) {//返回最近一个月的数据result.add(val);} else {//时间超过一个月没搜索就把这个词热度归0zSetOperations.add("title", val, 0);}}}return result;} //每次点击给相关词searchkey热度 +1@Overridepublic int incrementScore(String searchkey) {String key = searchkey;Long now = System.currentTimeMillis();ZSetOperations zSetOperations = redisSearchTemplate.opsForZSet();ValueOperations<String, String> valueOperations = redisSearchTemplate.opsForValue();zSetOperations.incrementScore("title", key, 1);valueOperations.getAndSet(key, String.valueOf(now));return 1;}}核心的部分写完了,剩下的需要你自己将如上方法融入到你自己的代码中就行了。
代码实现过滤不雅文字功能在springboot 里面写一个配置类加上@Configuration注解,在项目启动的时候加载一下,代码如下:
package com.***.***.interceptor; import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import java.io.*;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;//屏蔽敏感词初始化@Configuration@SuppressWarnings({ "rawtypes", "unchecked" })public class SensitivewordInit {// 字符编码private String ENCODING = "UTF-8";// 初始化敏感字库public Map initKeyWord() throws IOException {// 读取敏感词库 ,存入Set中Set<String> wordSet = readSensitiveWordFile();// 将敏感词库加入到HashMap中//确定有穷自动机DFAreturn addSensitiveWordToHashMap(wordSet);} // 读取敏感词库 ,存入HashMap中private Set<String> readSensitiveWordFile() throws IOException {Set<String> wordSet = null;ClassPathResource classPathResource = new ClassPathResource("static/censorword.txt");InputStream inputStream = classPathResource.getInputStream();//敏感词库try {// 读取文件输入流InputStreamReader read = new InputStreamReader(inputStream, ENCODING);// 文件是否是文件 和 是否存在wordSet = new HashSet<String>();// StringBuffer sb = new StringBuffer();// BufferedReader是包装类,先把字符读到缓存里,到缓存满了,再读入内存,提高了读的效率。BufferedReader br = new BufferedReader(read);String txt = null;// 读取文件,将文件内容放入到set中while ((txt = br.readLine()) != null) {wordSet.add(txt);}br.close();// 关闭文件流read.close();} catch (Exception e) {e.printStackTrace();}return wordSet;}// 将HashSet中的敏感词,存入HashMap中private Map addSensitiveWordToHashMap(Set<String> wordSet) {// 初始化敏感词容器,减少扩容操作Map wordMap = new HashMap(wordSet.size());for (String word : wordSet) {Map nowMap = wordMap;for (int i = 0; i < word.length(); i++) {// 转换成char型char keyChar = word.charAt(i);// 获取Object tempMap = nowMap.get(keyChar);// 如果存在该key,直接赋值if (tempMap != null) {nowMap = (Map) tempMap;}// 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个else {// 设置标志位Map<String, String> newMap = new HashMap<String, String>();newMap.put("isEnd", "0");// 添加到集合nowMap.put(keyChar, newMap);nowMap = newMap;}// 最后一个if (i == word.length() - 1) {nowMap.put("isEnd", "1");}}}return wordMap;}}然后这是工具类代码 :
package com.***.***.interceptor; import java.io.IOException;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set; //敏感词过滤器:利用DFA算法进行敏感词过滤public class SensitiveFilter {//敏感词过滤器:利用DFA算法进行敏感词过滤private Map sensitiveWordMap = null; // 最小匹配规则public static int minMatchType = 1; // 最大匹配规则public static int maxMatchType = 2; // 单例private static SensitiveFilter instance = null; // 构造函数,初始化敏感词库private SensitiveFilter() throws IOException {sensitiveWordMap = new SensitiveWordInit().initKeyWord();} // 获取单例public static SensitiveFilter getInstance() throws IOException {if (null == instance) {instance = new SensitiveFilter();}return instance;} // 获取文字中的敏感词public Set<String> getSensitiveWord(String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<String>();for (int i = 0; i < txt.length(); i++) {// 判断是否包含敏感字符int length = CheckSensitiveWord(txt, i, matchType);// 存在,加入list中if (length > 0) {sensitiveWordList.add(txt.substring(i, i + length));// 减1的原因,是因为for会自增i = i + length - 1;}}return sensitiveWordList;}// 替换敏感字字符public String replaceSensitiveWord(String txt, int matchType, String replaceChar) {String resultTxt = txt;// 获取所有的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word = null;String replaceString = null;while (iterator.hasNext()) {word = iterator.next();replaceString = getReplaceChars(replaceChar, word.length());resultTxt = resultTxt.replaceAll(word, replaceString);}return resultTxt;} /** * 获取替换字符串 * * @param replaceChar * @param length * @return */private String getReplaceChars(String replaceChar, int length) {String resultReplace = replaceChar;for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;} /** * 检查文字中是否包含敏感字符,检查规则如下:<br> * 如果存在,则返回敏感词字符的长度,不存在返回0 * @param txt * @param beginIndex * @param matchType * @return */public int CheckSensitiveWord(String txt, int beginIndex, int matchType) {// 敏感词结束标识位:用于敏感词只有1位的情况boolean flag = false;// 匹配标识数默认为0int matchFlag = 0;Map nowMap = sensitiveWordMap;for (int i = beginIndex; i < txt.length(); i++) {char word = txt.charAt(i);// 获取指定keynowMap = (Map) nowMap.get(word);// 存在,则判断是否为最后一个if (nowMap != null) {// 找到相应key,匹配标识+1matchFlag++;// 如果为最后一个匹配规则,结束循环,返回匹配标识数if ("1".equals(nowMap.get("isEnd"))) {// 结束标志位为trueflag = true;// 最小规则,直接返回,最大规则还需继续查找if (SensitiveFilter.minMatchType == matchType) {break;}}}// 不存在,直接返回else {break;}} if (SensitiveFilter.maxMatchType == matchType){if(matchFlag < 2 || !flag){//长度必须大于等于1,为词matchFlag = 0;}}if (SensitiveFilter.minMatchType == matchType){if(matchFlag < 2 && !flag){//长度必须大于等于1,为词matchFlag = 0;}}return matchFlag;}}在你代码的controller层直接调用方法判断即可:
//非法敏感词汇判断SensitiveFilter filter = SensitiveFilter.getInstance();int n = filter.CheckSensitiveWord(searchkey,0,1);if(n > 0){ //存在非法字符logger.info("这个人输入了非法字符--> {},不知道他到底要查什么~ userid--> {}",searchkey,userid);return null;}也可将敏感文字替换*等字符 :
SensitiveFilter filter = SensitiveFilter.getInstance();String text = "敏感文字";String x = filter.replaceSensitiveWord(text, 1, "*");最后刚才的?SensitiveWordInit.java?里面用到了?censorword.text?文件,放到你项目里面的 resources 目录下的 static 目录中,这个文件就是不雅文字大全,也需要您与时俱进的更新,项目启动的时候会加载该文件。
原文:https://juejin.cn/post/710159440821827996