在过滤器中批改一个http请求的返回内容
在过滤器中修改一个http请求的返回内容
上篇中解决问题的过程中有看过一些response的东西,在这总结一下
response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存.
之前遇到一个问题,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单的.
sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.给出一个实现:
然后在你的过滤器中这么使用:
如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集..........
上篇中解决问题的过程中有看过一些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();*/ }
如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集..........
1 楼
ahao99
2011-12-29
哥给你回一个