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万个敏感词,有哪些解决思路? 有十 ...
随机推荐
- 201871010128-杨丽霞《面向对象程序设计(java)》第八周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- 201871010136—赵艳强《面向对象程序设计(java)》第十三周学习总结
201871010136—赵艳强<面向对象程序设计(java)>第十三周学习总结 博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https:// ...
- Linux 怎样更改locale语言设置
推荐使用UTF8编码,因为这是国际标准,能兼容任何语言的编码.在CentOS VPS下修改语言编码: localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 export ...
- 四则运算web版需求规格说明书
目录 1引言... 4 1.1 目的... 4 1.2 背景... 4 1.3 术语... 4 1.4 预期读者与阅读建议... 5 1.5 参考资料... 6 1.6 需求描述约定... ...
- 微信小程序实现图片放大预览效果
可以直接用微信程序自己的api很方便的实现 核心方法 wx.previewImage: 直接上代码, wxml: <!--pages/prewpicture/prew.wxml--> &l ...
- ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用
前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简 ...
- 单调队列优化DP(超详细!!!)
一.概念 1.单调队列定义: 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素.因为其单调性所以经常会被用来维护区间最值 ...
- NOI 2010 海拔(最小割转最短路)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路 首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后 ...
- Java实现牛顿迭代法求解平方根、立方根
一.简介 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. ...
- Windwos Server 2016 远程桌面授权
https://blog.csdn.net/hanzheng260561728/article/details/80443135 第二步激活客户的的时候,注意事项
