使用java的过滤器filter备忘(HttpServletResponseWrapper)

测试中间件是weblogic8.1.4,jdk 是weblogic 自带的1.42

网上看到很多HttpServletResponseWrapper 的继承类的实现方法,最简单就是通过CharArrayWriter 对象缓存输出字符,但是这种方式只能在tomcat 中可以实现,在weblogic 中无法实现,因为weblogic 只能用流操作输出,下面的ResponseWrapper 代码是我试了很多次,终于在weblogic 上可以实现了。

但是个人是不建议使用ResponseWrapper 的,对于复杂页面,多层嵌套,多个编码组成的页面,单就乱码等就搞死人了,复杂的页面布局也不一定能正确显示。

一般用于简单构成页面,并且过滤器最好指定特定的地址。

在过滤器中写上下面这些, 最好加上try-catch-finally, 乱码问题自行解决

ResponseWrapper mr = new ResponseWrapper(response);    //定义好ResponseWrapper 对象,这个时候response 里面的流就写入到ResponseWrapper 对象里面了

chain.doFilter(request, mr);   //传给下一个过滤器

ServletOutputStream out = resp.getOutputStream();    //注意weblogic 的话,getReader 和getOutputStream 两者只能调用其中一个,weblogic 默认调用了getOutputStream,调用getReader 会报异常。

String result = new String(mr.getResponseData());  //获取输出内容

response.setContentLength(-1);                 //避免输出内容有差错,写上这个

out.write(result.getBytes(), 0, result.length());         //重新输出内容

out.flush();
out.close();

下面都是ResponseWrapper 的代码,要全部搬上去,已经通过了weblogic8.1.4 的测试

package filters;

import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpServletRequestWrapper;
 
 
public class ResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream buffer = null;

    private ServletOutputStream out = null;

    private PrintWriter writer = null;
 
    public ResponseWrapper(HttpServletResponse response) throws IOException {
        super(response);
        
        buffer = new ByteArrayOutputStream();
        out = new WapperedOutputStream(buffer);

        writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding()));
    }
 
    public PrintWriter getWriter() throws IOException {
        return writer;
    }
 
    public ServletOutputStream getOutputStream() throws IOException {
        return out;
    }


    public void flushBuffer() throws IOException {
        if (out != null) {
        	out.flush();
        }
        if (writer != null) {
            writer.flush();
        }
    }
    
    public void reset() {
        buffer.reset();
    }
    
    public byte[] getResponseData() throws IOException {
        flushBuffer();
        return buffer.toByteArray();
    }
 
}

package filters;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.servlet.ServletOutputStream;

public class WapperedOutputStream extends ServletOutputStream {

	private ByteArrayOutputStream bos = null;

    public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
        bos = stream;
    }


    public void write(int b) throws IOException {

        bos.write(b);

    }

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值