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

本文介绍如何通过继承HttpServletResponseWrapper创建CharResponseWrapper类,以实现对Servlet输出流的自定义操作,包括修改输出内容、压缩图片等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇中解决问题的过程中有看过一些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();*/

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值