java在过滤器中修改一个http请求的返回内容
response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存.
sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.首先要先子类化HttpServletResponseWrapper。
先子类化HttpServletResponseWrapper
1、获取response对象,并将输出存放在自定义的流里面,那么关于输出流(outputStream、writer)的操作都是需要重写的了:
1)以流的方式获取输出——重写getOutputStrem()
2)以字符方式获取输出——重写getWriter()
3)刷新流——重写flushBuffer()
4)重置流——重写reset()
然后加入新增的获取输出数据的方法就ok了。
2、定义response包装器WapperedResponse继承HttpServletResponseWrapper
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class ResponseWrapper extends HttpServletResponseWrapper {
private PrintWriter cachedWriter;
private CharArrayWriter bufferedWriter;
private ServletOutputStream out=null;
public ResponseWrapper(HttpServletResponse response) throws IOException {
super(response);
// 这个是我们保存返回结果的地方
bufferedWriter = new CharArrayWriter();
out=new WapperedOutputStream(bufferedWriter);
// 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中
cachedWriter = new PrintWriter(bufferedWriter);
}
//重载父类获取writer的方法
@Override
public PrintWriter getWriter() throws UnsupportedEncodingException{
return cachedWriter;
}
//重载父类获取outputstream的方法
@Override
public ServletOutputStream getOutputStream()throws IOException{
return out;
}
//重载父类获取flushBuffer的方法
@Override
public void flushBuffer()throws IOException{
if(out!=null){
out.flush();
}
if(cachedWriter!=null){
cachedWriter.flush();
}
}
@Override
public void reset(){
set();
}
/**
* 获取原始的HTML页面内容。
* @return
*/
public String getResult() throws IOException{
flushBuffer();
String();
}
//内部类,对ServletOutputStream进行包装
private class WapperedOutputStream extends ServletOutputStream{ java stream
private CharArrayWriter bos=null;
public WapperedOutputStream(CharArrayWriter stream) throws IOException{
bos=stream;
}
@Override
public void write(int b) throws IOException{
bos.write(b);
}
}
}
然后在过滤器中使用,如下:
import java.io.IOException;
import java.io.PrintWriter;
import Matcher;
import Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class InitLabelParamSidFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding("utf-8");
PrintWriter out = null;
try{
// 使用我们自定义的响应包装器来包装原始的ServletResponse
ResponseWrapper wrapper =
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论