首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-09-08 
在过滤器中修改一个http请求的返回内容上篇中解决问题的过程中有看过一些response的东西,在这总结一下resp

在过滤器中修改一个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();*/}

如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集.......... 1 楼 ahao99 2011-12-29   哥给你回一个

热点排行