http1xstream.java_在过滤器中修改一个http请求的返回内容

上篇中解决问题的过程中有看过一些response的东西,在这总结一下

response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存.

之前遇到一个问题,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单的.

sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.给出一个实现:package com.ali.report.birt.filter;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

public class CharResponseWrapper extends HttpServletResponseWrapper {

private ByteArrayOutputStream buffer=null;

private ServletOutputStream out=null;

private PrintWriter writer=null;

public CharResponseWrapper(HttpServletResponse resp) throws IOException{

super(resp);

buffer=new ByteArrayOutputStream();//真正存储数据的流

out=new WapperedOutputStream(buffer);

writer=new PrintWriter(new OutputStreamWriter(buffer,this.getCharacterEncoding()));

}

//重载父类获取outputstream的方法

@Override

public ServletOutputStream getOutputStream()throws IOException{

return out;

}

//重载父类获取writer的方法

@Override

public PrintWriter getWriter() throws UnsupportedEncodingException{

return writer;

}

//重载父类获取flushBuffer的方法

@Override

public void flushBuffer()throws IOException{

if(out!=null){

out.flush();

}

if(writer!=null){

writer.flush();

}

}

@Override

public void reset(){

buffer.reset();

}

public String getContent()throws IOException{

flushBuffer();//将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据

return new String(buffer.toByteArray());

}

//内部类,对ServletOutputStream进行包装

private class WapperedOutputStream extends ServletOutputStream{

private ByteArrayOutputStream bos=null;

public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{

bos=stream;

}

@Override

public void write(int b) throws IOException{

bos.write(b);

}

}

}

然后在你的过滤器中这么使用:

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

CharResponseWrapper crw = new CharResponseWrapper((HttpServletResponse)response);

chain.doFilter(request, crw);

String content = crw.getContent();//response流的内容

//此处可以对content做处理,然后再把content写回到输出流中

response.setContentLength(-1);

PrintWriter out = response.getWriter();

content = this.changeContent(content, sessionid, folder);

out.write(content);

out.flush();

out.close();*/

}

如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集..........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值