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);}@Overridepublic PrintWriter getWriter() throws IOException {//返回字符数组Writer,缓存内容return new PrintWriter(charWriter);}public CharArrayWriter getCharWriter() {return charWriter;}}
