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万个敏感词,有哪些解决思路? 有十 ...
随机推荐
- nullptr与NULL
NULL NULL can be defined as any null pointer constant. Thus existing code can retain definitions of ...
- Virtualbox 修改硬盘的序列号等信息 例
Virtualbox 修改硬盘的序列号等信息 例 http://blog.csdn.net/eidolon8/article/details/42709365 原创 2015年01月14日 14:24 ...
- Ant下载与安装
1.登录http://ant.apache.org/bindownload.cgi 站点下载Ant最新版建议Windows平台下载*.zip压缩包 2.将下载到的压缩文件压缩到(G:software\ ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- 求职-DB相关职位常见face题
数据分析是个通用技能,适合各行各业,比如运营.产品.分析等职位都会要求会数据分析. 一.考察对数据分析岗位的理解与职业规划 数据分析师与数据工程师的区别在哪里? 为什么转行, 为什么没在公司内部转岗? ...
- BZOJ5243 : [Lydsy2017省队十连测]绝版题
要找的就是这棵树的带权重心,以带权重心为根时每棵子树的权值和不超过总权值和的一半. 因此按$\frac{v[i]}{\sum v[i]}$的概率随机选取一个点$x$,则重心有$\frac{1}{2}$ ...
- c# 笔试面试题01
一.抽象与接口的区别: ,抽象(abstract): ()抽象类中可以有抽象方法,也可没有: ()抽象方法包含实现,也可以由子类实现: ()抽象类不能被sealed修饰,只能使用abstract关键字 ...
- X509证书 指定了无效的提供程序类型 System.Security.Cryptography.CryptographicException 错误解决方法
第一种解决办法: IIS 应用程序池--选中你网站的所配置的应用程序池--右键 选择 “高级配置” --将“加载用户配置文件” 设置为True 第二种解决办法: 在加载证书方法时使用以下方法,请注意第 ...
- 非替代品,MongoDB与MySQL对比分析
IT168 评论]对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数 ...
- torch_06_卷积神经网络
1.概述 卷积神经网络的参数,由一些可学习的滤波器集合构成的,每个滤波器在空间上都计较小,但是深度和输入数据的深度保持一致.在前向传播中,让每个滤波器都在输入数据的宽度和高度上滑动(卷积),然后计算整 ...