Filter实现全站违法关键词屏蔽
思路:客户端请求服务器数据,经过Filter过滤(请求放行,响应拦截),服务器向客户端返回数据时,在Filter中修改掉返回数据中违法的部分。
修改服务器的响应需要自定义一个HttpServletResponse的包装类,继承自HttpServletResponseWrapper即可实现自己的HttpServletResponse的包装类。
大概是这样的:
//package com.ecshop.tools;
import java.io.CharArrayWriter;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class ShieldKeywordResponseWrapper extends HttpServletResponseWrapper{
private CharArrayWriter caw;
private PrintWriter pw;
public ShieldKeywordResponseWrapper(HttpServletResponse response) {
super(response);
// 这个是我们保存返回结果的地方
caw = new CharArrayWriter();
// 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到caw中
pw = new PrintWriter(caw);
}
@Override
public PrintWriter getWriter() {
return pw;
}
public String getResult() {
return caw.toString();
}
}
因为违法关键词都包含在响应文本消息中,服务器向请求客户端响应文本消息必须获取HttpServletResponse对象中的PrintWriter文本输出流对象进行输出消息,所以我们的这个封装类覆盖HttpServletResponse的getWriter是很重要的一步,我这个封装类的意思是让服务器响应数据时使用我们修改过的PrintWriter文本输出流,输出的数据并不立刻响应给客户,而是把输出的数据都保留在了CharArrayWriter这个对象中,当控制层执行完毕我们就可以在Filter中进行获取CharArrayWriter对象中的数据进行修改了,修改完毕我们在返回给你客户,就是我们想要的效果了。(而默认HttpServletResponse的PrintWriter对象是由tomcat自己所扩展自PrintWriter的CoyoteWriter对象,CoyoteWriter对象所打印的数据都保留在OutputBuffer对象(也是tomcat自己所扩展自Writer的一个对象)中,我们不方便获取它的文本数据,所以我们修改掉它,当OutputBuffer执行flush就发送消息,或者不执行让servlet结束后自动发送消息)。
以上是我看了一点tomcat源码然后瞎推理,对不对无所谓。。
当我们HttpServletResponse的包装类弄完剩下的就好办了。
//我们看下过滤器中的doFilter函数部分代码就足够了
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res= (HttpServletResponse) response;
//我们刚刚做的包装类在这里
ShieldKeywordResponseWrapper skrw= new ShieldKeywordResponseWrapper(res);
chain.doFilter(request, skrw);
//在servlet处理完毕后我们开始做处理
String result = skrw.getResult();
//替换关键词为*
Properties p = new Properties();
p.load(ShieldKeywords.class.getResourceAsStream("/keywords.properties"));
Set<Entry<Object, Object>> se= p.entrySet();
for(Entry<Object, Object> e:se){
result = result.replace(String.valueOf(e.getKey()), String.valueOf(e.getValue()));
}
// 输出最终的结果
PrintWriter out = response.getWriter();
out.write(result);
//以下两句无作用,CharArrayWriter中为空函数,tomcat自己提供的OutputBuffer执行这两句才有作用
out.flush();
out.close();
}
最后看下keywords.properties文件的内容:
违法词1=*
违法词2=*
建议web.xml中过滤器配置时只映射响应文本数据的请求url,因有的请求是要获取一个文件流,服务器HttpServletResponse响应时文本输出流和字节流是冲突的,正常情况下两者只可取一,不然会报错
Filter实现全站违法关键词屏蔽的更多相关文章
- javaWeb 使用 filter 处理全站乱码问题
1. web.xml文件中的配置 <filter> <filter-name>CharacterEncodingFilter</filter-name> <f ...
- WordPress如何屏蔽恶意关键词搜索
我们在用WordPress建站比较方便,但如果网站有一定的权重后,一些不怀好意的人就会过来制作恶意内容,比如故意搜索邪恶的关键词.垃圾评论等,那我们如何屏蔽恶意搜索关键词呢?不会很难,会写点代码的朋友 ...
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- Fiddler屏蔽某些url的抓取方法
在用Fiddler调试网页的时候,可能某些频繁的ajax轮询请求会干扰我们,可以通过以下方法屏蔽某些url的抓取. 在需要屏蔽的url行上右键---->“Filter Now”-----> ...
- Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)
Solr查询参数文档可以参考: http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758 ...
- 【Java】全站编码过滤器GenericEncodingFilter代码与配置
编码过滤器GenericEncodingFilter: package com.fuck.web.filter; import java.io.IOException; import java.i ...
- 庭审全程文字实录 z
备受关注的深圳快播公司涉黄案两日来在北京市海淀法院开庭审理,快播CEO王欣(微博).事业部总经理吴铭.事业部副总经理张克东.事业部副总经理兼市场部总监牛文举出庭接受审理. 面对传播淫秽物品牟利罪的指控 ...
- Java精选笔记_Filter(过滤器)
Filter(过滤器) Filter入门 什么是Filter Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
随机推荐
- 数据处理项目Beta阶段软件架构建议
class:Dataserver string serverIP string serverPassword string sqlAccount string sqlPassword bool Dat ...
- hive权限管理之实践
一.实践心得 主要参考这个连接,里面说得也挺详细的.http://www.aboutyun.com/thread-12549-1-1.html 总结如下: 1.若赋予用户某个表的权限,查用户在该表所属 ...
- SQL书写规范及常用SQL语句
常用的查询语句 SELECT * FROM 表名 [WHERE 条件 或 GROUP BY 字段名 HAVING] ORDER BY 字段名 排序方式 LIMIT 初始值,数量; SELECT fna ...
- 附录三 嵌入式C程序的编译与调试
课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...
- OpenCV CommandLineParser 的用法
OpenCV CommandLineParser 的用法 去百度了一下,关键字:OpenCV CommandLineParser 发现,最多的讲解是:opencv源码解析之(5):CommandLi ...
- 基于OkHttp的封装库TigerOkHttp的使用
在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...
- fork炸弹
众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少“函数”这个元素来帮助程序进行 模块化的高效开发与管理.于是产生了由于其特殊的特性,bash ...
- python小程序:无限求和平均
编写一个程序,重复读取数据,直到用户输入‘done’.一旦输入‘done’,打印总和.个数与平均值.如果用户输入的不是数字,使用try和except捕获异常,打印错误信息,然后跳过继续执行循环. ar ...
- html之内联标签img
img创建的是被链接图像的占位空间,它不会真正地在网页插入图像. 两个必须属性: src:图像的超链接 alt:图像的替代文本 可选属性: height:高度 width:宽度 ismap:将图像定义 ...
- 延迟加载、异步加载js
defer为true:延迟加载脚本,在文档完成解析完成开始执行,并且在DOMContentLoaded事件之前执行完成. async(HTML5新增的属性)为true:异步加载脚本,下载完毕后再执行, ...