JavaWeb 过滤敏感词汇
提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*。
检查、替换敏感词汇有3种常用的方式
(1)在Servlet中操作。
(2)在Filter中先检查。如果要替换敏感词汇,request没有setParameter()方法重新设置请求参数,怎么向Servlet中传递替换后的请求参数?使用request.setAttribute()把这些修改后的请求参数放到request域中即可。
(3)在Filter中创建request的代理,增强getParameter()方法,然后传入代理: chain.doFilter(request的代理对象 resp); 。如何增强getParameter()方法?getParameter()不是要返回一个String吗,先调用原来的getParameter()获取值,检查值中是否有敏感词汇,有就替换掉敏感词汇,返回替换后的值,没有敏感词汇就返回原值。
(1)、(2)较简单,但很繁琐,(3)最常用。此处只演示(3)。
敏感词汇
敏感词汇很多,可以存储在数据库中,也可以存储在文本文件中。
此处我们在项目根目录下新建文件夹resource,标识为资源根目录。resource下新建 illegal_word.txt 存储敏感词汇,一行一个。
煞笔
制杖
cxk
每次都从数据库读或文件取读敏感词汇,会增加时间开销,可以把取敏感词汇放到ServletContext中,全局共享、随时可用。
怎么放?Filter的init()方法在Filter生命周期中只调用一次,可以在init()中读取敏感词汇,将敏感词汇放到ArrayList<String>中,再将这个list放到ServletContext中,这样避免了每访问一次就读取一次的问题。
表单
<form action="handlerServlet" method="post">
评论:<textarea name="comment" rows="10" cols="50"></textarea>
<button type="submit">提交</button>
</form>
Filter
@WebFilter("/handlerServlet")
public class HandlerFilter implements Filter {
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8"); //jdk动态代理
ClassLoader classLoader = req.getClass().getClassLoader();
Class<?>[] interfaces = req.getClass().getInterfaces();
//创建InvocationHandler接口的实例。此处使用匿名内部类来创建
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//只增强getParameter()
if(method.getName().equals("getParameter")){
//调用原有的getParameter()获取参数值
String text = (String) method.invoke(req, args); //检查是否有敏感词汇
Object obj = req.getServletContext().getAttribute("illegal_word_list");
ArrayList<String> list=(ArrayList<String>)obj;
for (String word : list){
if (text.contains(word)){
//用一个*替换一个字符
String replac="";
for(int i=0;i<word.length();i++){
replac+="*";
}
//替换所有匹配
text = text.replaceAll(word, replac);
}
} return text;
} //如果调用的是getParameter(),执行到前面的return就结束了,不会执行到此
//如果调用的不是getParameter(),就调用原方法,不做修改
Object returnValue=method.invoke(req,args); //调用目标方法
return returnValue;
}
}; //创建req的代理对象
Object proxyInstance = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
//强转为ServletRequest
ServletRequest reqProxyInstance = (ServletRequest) proxyInstance; //传入req的代理对象
chain.doFilter(reqProxyInstance, resp);
} public void init(FilterConfig config) throws ServletException {
InputStream is= this.getClass().getResourceAsStream("/illegal_word.txt");
//因为要readLine()一行一行地读,需要使用BufferedReader流,所以先转换为Reader,再加Buffer
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
ArrayList<String> list=new ArrayList<>();
String str=null;
while (true){
try {
str=br.readLine();
if (str!=null)
list.add(str);
else
break;
} catch (IOException e) {
e.printStackTrace();
}
} //放到ServletContext中
config.getServletContext().setAttribute("illegal_word_list",list);
} }
测试用的Servlet
@WebServlet("/handlerServlet")
public class HandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String comment = request.getParameter("comment");
response.getWriter().write(comment);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
效果
这种方式是增强getParameter(),通过getParameter()获取参数值时,都会先自动检测是否有敏感词汇。
JavaWeb 过滤敏感词汇的更多相关文章
- java过滤敏感词汇
前言 现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的.不健康的.影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案 第一种方式 创建敏感词汇文件:首先需要准备一个 ...
- Filter - 过滤敏感词汇(动态代理)
/** * 敏感词汇过滤器 */ @WebFilter("/*") public class SensitiveWordsFilter implements Filter { pu ...
- Java过滤敏感词语/词汇---DFA算法
最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...
- PHP+Ajax判断是否有敏感词汇
本文讲述如何使用PHP和Ajax创建一个过滤敏感词汇的方法,判断是否有敏感词汇. 敏感词汇数组sensitive.php return array ( 0 => '111111', 1 => ...
- JavaWeb 之 Filter 敏感词汇过滤案例
需求: 1. 对day17_case案例录入的数据进行敏感词汇过滤 2. 敏感词汇参考 src路径下的<敏感词汇.txt> 3. 如果是敏感词汇,替换为 *** 分析: 1. 对reque ...
- js过滤检测敏感词汇
html: <textarea rows="10" cols="100" id="myDiv"></textarea> ...
- web前端js过滤敏感词
web前端js过滤敏感词 这里是用文本输入框还有文本域绑定了失去焦点事件,然后再遍历敏感词数组进行匹配和替换. var keywords=["阿扁","呵呵", ...
- php 过滤敏感关键词
php 过滤敏感关键词 function badwords($content){ $keywords=M("config")->where("name='badwo ...
- (转)两种高效过滤敏感词算法--DFA算法和AC自动机算法
原文:https://blog.csdn.net/u013421629/article/details/83178970 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十 ...
随机推荐
- 面向对象程序设计(Java) 第4周学习指导及要求
2019面向对象程序设计(Java)第4周学习指导及要求(2019.9.17-2019.9. 23) 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类 ...
- 用python提取xml里面的链接源码
因群里朋友需要提取xml地图里面的链接,就写了这个程序. 代码: #coding=utf-8 import urllib import urllib.request import re url='ht ...
- c#中几种数据结构
数组型: Array:内存连续分配,长度不可变,可索引访问. ArrayList:早期版本使用,非泛型,类型不安全,如果元素数据类型不同可考虑使用. List<>:泛型,可变长度,内存连续 ...
- 微信小程序特性总结
一. 小程序不是运行在浏览器中, 所以没有BOM和DOM对象 即console.log(window)和console.log(document)是获取不到任何内容的 二. 小程序特有的额外js成员( ...
- docker的一些常用操作
镜像:一个打包好的应用,还有应用运行的系统.资源.配置等容器:镜像的实例,一个镜像可以有一个或多个实例(容器)对docker容器的变更时写到容器的文件系统的,而不是写到docker镜像中的,可以用一个 ...
- [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)
世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图) 然后大力枚举每个换 ...
- [LeetCode] 885. Spiral Matrix III 螺旋矩阵之三
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...
- [LeetCode] 786. K-th Smallest Prime Fraction 第K小的质分数
A sorted list A contains 1, plus some number of primes. Then, for every p < q in the list, we co ...
- [LeetCode] 189. Rotate Array 旋转数组
Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...
- SpringBoot的ApplicationRunner
Article1 在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为Co ...