前言:这个是我自己学习《Java Web 整合开发 王者归来》的学习笔记,对你们可能没有参考价值。这是filter那一章中,关于内容替换的filterGZIP压缩Filter的学习总结。
        这两个Filter中对response进行了修改,把这两个例子的代码都重新实现之后,弄懂了基本原理,但是也出现了一些困惑。
        大家可以下载《Java Web 整合开发 王者归来》的源代码,查阅filter压缩文件。
内容替换Filter的学习心得
        内容替换的原理是,在Servlet将内容输出到response时,response将内容缓存起来,在Filter中进行替换,然后再输出到客户端浏览器,由于默认的response不能严格地将内容缓存起来,因此需要自定义一个具备缓存功能的response。
        如果response输出的的内容为字符类内容,则会调用getWrite()方法;如果是二进制内容则会调用getOutputStream()方法;
        通过扩展javax.servlet.http.HttpServletResponseWrapper类覆盖其中的getWrite()方法。
package helloJava.respone;

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class HttpCharacterResponseWrapper extends HttpServletResponseWrapper
{
    private CharArrayWriter ref_charArrayWriter = new CharArrayWriter();

    public HttpCharacterResponseWrapper(HttpServletResponse response)
    {
        super(response);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public PrintWriter getWriter() throws IOException {
        return new PrintWriter(ref_charArrayWriter);
    }
    public CharArrayWriter getCharArrayWriter() {
        return ref_charArrayWriter;
    }

}
HttpServletResponseWrapper代码

    在Filter中将自定义的response传进Servlet中代码如下:

package helloJava.filter;

import helloJava.respone.HttpCharacterResponseWrapper;

import java.io.FileInputStream;
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;

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
    {
        // TODO Auto-generated method stub
        //自定义的 Response
        HttpCharacterResponseWrapper ref_charResponse=new HttpCharacterResponseWrapper(
                                            (HttpServletResponse)response);
        chain.doFilter(request,ref_charResponse);
        
        String output=ref_charResponse.getCharArrayWriter().toString();
        for(Object obj:pp.keySet())
        {
            String key=(String) obj;
            output=output.replace(key,pp.getProperty(key));
        }
        //这部分不是特别明白,response是入口参数传递过来的
        PrintWriter out =response.getWriter();
        out.write(output);
        out.println("<!--Generated at "+new java.util.Date()+"-->");
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {
        // TODO Auto-generated method stub
        String file=filterConfig.getInitParameter("file");
        String realPath=filterConfig.getServletContext().getRealPath(file);
        try
        {
            pp.load(new FileInputStream(realPath));
        }
        catch(IOException e)
        {

        }
    }
}
OutputReplaceFilter 代码

相关文章:

  • 2022-02-09
  • 2021-11-23
  • 2021-11-12
  • 2021-12-24
  • 2021-10-07
  • 2021-12-17
  • 2021-12-11
  • 2021-11-21
猜你喜欢
  • 2021-09-04
  • 2021-05-28
  • 2021-07-21
  • 2022-01-23
  • 2022-12-23
  • 2021-07-05
  • 2021-11-14
相关资源
相似解决方案