有时候需要对网站进行控制,防止输出非法内容或者敏感信息。这时我们可以使用filter来进行内容替换,其工作原理为,在Servlet将内容输出到response时,response将内容缓存起来,在Filter中进行替换,然后再输出到客户浏览器。由于默认的response并不能严格的缓存输出内容,因此需要自定义一个具备缓存功能的response。

可以通过扩展javax.servlet.http.HttpServletResponseWrapper类来实现自定义response。该类实现了javax.servlet.http.HttpServletResponse接口的所有方法,根据需要覆盖其中相应的方法即可,代码如下:HttpServletResponseWrapper.java

 package com.yzj.response;

 import java.io.CharArrayWriter;
import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; public class HttpCharacterResponseWrapper extends
HttpServletResponseWrapper {
private CharArrayWriter charArrayWriter = new CharArrayWriter();
//字符数组Writer public HttpCharacterResponseWrapper(HttpServletResponse response) {
super(response);
// TODO Auto-generated constructor stub
} public PrintWriter getWriter(){//覆盖父类方法
return new PrintWriter(charArrayWriter);
}//返回字符数组Writer,缓存内容 public CharArrayWriter getCharArrayWriter() {
return charArrayWriter;//getter方法
}
}

该类覆盖了getWriter()方法,当servlet中使用该response对象调用getWriter()方法来输出内容时,内容将会被输出到CharArrayWriter对象中,达到缓存效果。

Filter中需要自定义的response传进servlet中,代码如下:OutputReplaceFilter.java

 package com.yzj.filter;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import com.yzj.response.HttpCharacterResponseWrapper; public class OutputReplaceFilter implements Filter { private Properties pp = new Properties();
//非法词、敏感词,配置在初始化参数中 @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpCharacterResponseWrapper responseWrapper = new HttpCharacterResponseWrapper((HttpServletResponse) response); chain.doFilter(request, responseWrapper); //doFilter,使用自定义response String output = responseWrapper.getCharArrayWriter().toString();
//得到responseWrapper输出内容 for(Object obj:pp.keySet()){
//遍历所有敏感词
String key = (String) obj;
output = output.replace(key, pp.getProperty(key));//替换敏感词
}
PrintWriter out = response.getWriter();
//通过原来的response的getWriter()方法输出
out.write(output);
out.println("<!--Generated at"+new java.util.Date()+"-->"); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化时
String file = filterConfig.getInitParameter("file"); //配置文件的位置
String realPath = filterConfig.getServletContext().getRealPath(file);
//文件得实际位置 try {
pp.load(new FileInputStream(realPath));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

本例中,自定义的response只是一个“伪装”的response。Servlet会通过它输出内容到客户端,但是它的内容只是将内容缓存起来了,并没有真正输出到客户端。最终输出到客户端还是通过原来的response完成。

非法词库配置在properties文件中,通过Filter初始化参数传给内容替换Filter。该properties文件内容如下:sensitive.properties

 #amend
Chna = China
www.baidu.com.cn = ww.baidu.com #replace
色情 = **
情色 = **
赌博 = **

内容替换Filter的配置文件。web.xml

    <filter>
<filter-name>OutputReplaceFilter</filter-name>
<filter-class>
com.yzj.filter.OutputReplaceFilter
</filter-class>
<init-param>
<param-name>file</param-name>
<param-value>/WEB-INF/sensitive.properties</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>OutputReplaceFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

jsp文件代码如下:replace.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> Chna <br/>
<br/>
色情 <br/>
赌博 <br/>
情色 <br/>
<br/>
www.baidu.com.cn <br/> </body>
</html>

内容替换Filter的更多相关文章

  1. paip.输出内容替换在Apache 过滤器filter的设置

    paip.输出内容替换在Apache 过滤器filter的设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...

  2. python字符串内容替换的方法(转载)

    python字符串内容替换的方法 时间:2016-03-10 06:30:46来源:网络 导读:python字符串内容替换的方法,包括单个字符替换,使用re正则匹配进行字符串模式查找与替换的方法.   ...

  3. 变量声明declare,简单运算符运算,变量测试与内容替换

    declare -/+ 选项 变量名 - 设类型 + 取消类型 -i 设为整型 -x 设为环境变量 -p 显示类型属性(property) [root@localhost ~]# a= [root@l ...

  4. 使用Nginx反向代理和内容替换模块实现网页内容动态替换功能

    2016年11月21日 10:30:00 xian_02 阅读数:10943   Nginx是一款轻量级高性能服务器软件,虽然轻量,但功能非常强大,可用于提供WEB服务.反向代理.负载均衡.缓存服务. ...

  5. mysql数据库字段内容替换

    UPDATE 表名 SET 字段名= replace(字段名, '查找内容', '替换成内容') ; UPDATE car_articles SET article_title = replace(a ...

  6. JAVA编码 —— 字符串关键字内容替换

    前言 工作中,我们可能遇到字符串内容替换的场景.例如:我们需要将一个字符串凡是 “#” 标注的,分别替换为不同的内容,那我们应该怎么做呢? 分析,一个字符串可能含有多个“#”,每个 “#”又对应不同的 ...

  7. dede数据库内容替换,去掉文章内容中的img标签

    1.织梦已经给我们准备好了数据库内容替换工具,在采集->批量维护->数据库内容替换 2.织梦的文章内容一般在放在dede_addonarticle表body字段中. (1).选择好数据表和 ...

  8. git将一个分支的内容替换为另一分支内容

    假设我想将我的linux分支内容替换master分支的内容. # 切换到master分支 git checkout master # 再将本地的master分支重置成linux git reset - ...

  9. Python基于正则表达式实现文件内容替换的方法

    Python基于正则表达式实现文件内容替换的方法 本文实例讲述了Python基于正则表达式实现文件内容替换的方法.分享给大家供大家参考,具体如下: 最近因为有一个项目需要从普通的服务器移植到SAE,而 ...

随机推荐

  1. Jdk5.0新特性

    增强for循环:foreach语句,foreach简化了迭代器. 格式:// 增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 for( 元素类型 变量名 : Colle ...

  2. HDOJ1020 Encoding

    Problem Description Given a string containing only 'A' - 'Z', we could encode it using the following ...

  3. c语言运算符号详细说明

    C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符.其它都是左结合性. 判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺 ...

  4. Android学习笔记(三)Application类简介

    每次运行APP时,Application类都保持实例化状态.与Activity不同,配置改变不会导致应用程序重启.通过继承Application类,可以完成一下3项工作: · 对Android运行时广 ...

  5. [转载]JQuery.closest(),parent(),parents()寻找父节点

    1.通过item-1查找 level-3(查找直接上级) $('li.item-1').closest('ul') $('li.item-1').parent() $('li.item-1').par ...

  6. Android定义的路径全局变量

    Android定义的路径全局变量 ifeq (,$(strip $(OUT_DIR))) OUT_DIR := $(TOPDIR)out endif DEBUG_OUT_DIR := $(OUT_DI ...

  7. wine on ubuntu linux, and source insight 绿色版的安装

    1.安装一些必要组件 winetricks msxml3 gdiplus riched20 riched30 vcrun6 vcrun2005sp1 wenquanyi 2.拷贝字体 下载网盘中的字体 ...

  8. EXCEL VBA 选择文件对话框

    Sub XXX() Dim arr() arr = Application.GetOpenFilename("所有支付文件 (*.xls;*.xlsx;*.csv),*.xls;*.xlsx ...

  9. liststack——链表栈(procedure)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h&q ...

  10. 对javabean的内省操作

    import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...