Filter:

    1. @WebFilter(
    2. asyncSupported = true,
    3. description = "内容替换过滤器",
    4. filterName = "replaceFilter",
    5. urlPatterns = { "/*" },
    6. initParams = {
    7. @WebInitParam(name = "filePath", value = "replace_ZH.properties")
    8. }
    9. )
    10. public class ReplaceFilter implements Filter {
    11. private Properties propert = new Properties();
    12. public void init(FilterConfig filterConfig) throws ServletException {
    13. //通过filterConfig获得初始化文件名
    14. String filePath = filterConfig.getInitParameter("filePath");
    15. try {
    16. //导入资源文件
    17. propert.load(ReplaceFilter.class.getClassLoader()
    18. .getResourceAsStream(filePath));
    19. } catch (FileNotFoundException e) {
    20. e.printStackTrace();
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. public void doFilter(ServletRequest request, ServletResponse response,
    26. FilterChain chain) throws IOException, ServletException {
    27. HttpServletResponse res = (HttpServletResponse)response;
    28. //实例化响应器包装类
    29. ResponseReplaceWrapper resp = new ResponseReplaceWrapper(res);
    30. chain.doFilter(request, resp);
    31. //缓存输出字符
    32. String outString = resp.getCharWriter().toString();
    33. //循环替换不合法的字符
    34. for(Object obj:propert.keySet()){
    35. String key = (String) obj;
    36. outString = outString.replace(key, propert.getProperty(key));
    37. System.out.println(outString);
    38. }
    39. //用原先的HttpServletResponse输出字符
    40. PrintWriter out = res.getWriter();
    41. out.write(outString);
    42. }
    43. public void destroy() {
    44. }
    45. }

    responseReplaceWrapper

    1. package hx.edu;
    2. import javax.servlet.http.HttpServletResponse;
    3. import javax.servlet.http.HttpServletResponseWrapper;
    4. import java.io.CharArrayWriter;
    5. import java.io.IOException;
    6. import java.io.PrintWriter;
    7. public class ResponseReplaceWrapper extends HttpServletResponseWrapper {
    8. /*
    9. * CharArrayWriter 实现了以数组作为目标的输出流。CharArrayWriter 有两个构造函数:
    10. CharArrayWriter( )
    11. CharArrayWriter(int numChars)
    12. 第一种形式,创建了一个默认长度的缓冲器。
    13. * 第二种形式,缓冲器长度由numChars指定。
    14. * 缓冲器保存在CharArrayWriter的buf 成员中。
    15. * 缓冲器大小在需要的情况下可以自动增长。
    16. * 缓冲器保持的 字符数 包含在CharArrayWriter的count 成员中。buf 和count 都是受保护的域。
    17. */
    18. private final CharArrayWriter charWriter = new CharArrayWriter();
    19. public ResponseReplaceWrapper(HttpServletResponse response) {
    20. //必须调用父类构造方法
    21. super(response);
    22. }
    23. @Override
    24. public PrintWriter getWriter() throws IOException {
    25. //返回字符数组Writer,缓存内容
    26. return new PrintWriter(charWriter);
    27. }
    28. public CharArrayWriter getCharWriter() {
    29. return charWriter;
    30. }
    31. }