Filter:
@WebFilter(
asyncSupported = true,
description = "内容替换过滤器",
filterName = "replaceFilter",
urlPatterns = { "/*" },
initParams = {
@WebInitParam(name = "filePath", value = "replace_ZH.properties")
}
)
public class ReplaceFilter implements Filter {
private Properties propert = new Properties();
public void init(FilterConfig filterConfig) throws ServletException {
//通过filterConfig获得初始化文件名
String filePath = filterConfig.getInitParameter("filePath");
try {
//导入资源文件
propert.load(ReplaceFilter.class.getClassLoader()
.getResourceAsStream(filePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse)response;
//实例化响应器包装类
ResponseReplaceWrapper resp = new ResponseReplaceWrapper(res);
chain.doFilter(request, resp);
//缓存输出字符
String outString = resp.getCharWriter().toString();
//循环替换不合法的字符
for(Object obj:propert.keySet()){
String key = (String) obj;
outString = outString.replace(key, propert.getProperty(key));
System.out.println(outString);
}
//用原先的HttpServletResponse输出字符
PrintWriter out = res.getWriter();
out.write(outString);
}
public void destroy() {
}
}
responseReplaceWrapper
package hx.edu;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseReplaceWrapper extends HttpServletResponseWrapper {
/*
* CharArrayWriter 实现了以数组作为目标的输出流。CharArrayWriter 有两个构造函数:
CharArrayWriter( )
CharArrayWriter(int numChars)
第一种形式,创建了一个默认长度的缓冲器。
* 第二种形式,缓冲器长度由numChars指定。
* 缓冲器保存在CharArrayWriter的buf 成员中。
* 缓冲器大小在需要的情况下可以自动增长。
* 缓冲器保持的 字符数 包含在CharArrayWriter的count 成员中。buf 和count 都是受保护的域。
*/
private final CharArrayWriter charWriter = new CharArrayWriter();
public ResponseReplaceWrapper(HttpServletResponse response) {
//必须调用父类构造方法
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
//返回字符数组Writer,缓存内容
return new PrintWriter(charWriter);
}
public CharArrayWriter getCharWriter() {
return charWriter;
}
}