`

(转)用HttpServletResponseWrapper获取jsp的输出内容

    博客分类:
  • java
阅读更多

以下代码测试环境

windows server 2003,myeclipse5.5GA,tomcat6,运行通过

转自

http://hi.baidu.com/bobylou/blog/item/6045562cedb00aed8b13996c.html

代码1:在不跳转下访问目标jsp。就是利用RequestDispatcher.include(ServletRequest request, ServletResponse response)。该方法把RequestDispatcher指向的目标页面写到response中。

代码1
  1. public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response)    
  2. throws Exception    
  3. {    
  4. WrapperResponse wrapperResponse = new WrapperResponse(response);    
  5. request.getRequestDispatcher(jsppath).include(request, wrapperResponse);    
  6. return wrapperResponse.getContent();    
  7. }    

 

此处一个自定义类WrapperResponse封装了HttpServletResponse,具体请看一下代码

代码2:HttpServletResponse的封装类,继承自HttpServletResponseWrapper。其核心是构建一个OutputStream,且让HttpServletResponse获得的jsp内容输入到这个OutputStream。

java 代码2
  1. import java.io.ByteArrayOutputStream;   
  2. import java.io.IOException;   
  3. import java.io.PrintWriter;   
  4. import java.io.UnsupportedEncodingException;   
  5. import javax.servlet.http.HttpServletResponse;   
  6. import javax.servlet.http.HttpServletResponseWrapper;   
  7. public class WrapperResponse extends HttpServletResponseWrapper {   
  8.    private MyPrintWriter tmpWriter;   
  9.    private ByteArrayOutputStream output;   
  10.    public WrapperResponse(HttpServletResponse httpServletResponse) {   
  11.       super(httpServletResponse);   
  12.       output = new ByteArrayOutputStream();   
  13.       tmpWriter = new MyPrintWriter(output);   
  14.    }   
  15.    public void finalize() throws Throwable {   
  16.       super.finalize();   
  17.       output.close();   
  18.       tmpWriter.close();   
  19.    }   
  20.    public String getContent() {   
  21.       try {   
  22.          tmpWriter.flush();   //刷新该流的缓冲,详看java.io.Writer.flush()   
  23.          String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8");   
  24.          //此处可根据需要进行对输出流以及Writer的重置操作   
  25.        //比如tmpWriter.getByteArrayOutputStream().reset()   
  26.          return s;   
  27.       } catch (UnsupportedEncodingException e) {   
  28.          return "UnsupportedEncoding";   
  29.       }   
  30.    }   
  31.   
  32.    //覆盖getWriter()方法,使用我们自己定义的Writer   
  33.    public PrintWriter getWriter() throws IOException {   
  34.       return tmpWriter;   
  35.    }   
  36.    public void close() throws IOException {   
  37.       tmpWriter.close();   
  38.    }   
  39.   
  40.    //自定义PrintWriter,为的是把response流写到自己指定的输入流当中   
  41.    //而非默认的ServletOutputStream   
  42.    private static class MyPrintWriter extends PrintWriter {   
  43.       ByteArrayOutputStream myOutput;   //此即为存放response输入流的对象   
  44.   
  45.       public MyPrintWriter(ByteArrayOutputStream output) {   
  46.          super(output);   
  47.          myOutput = output;   
  48.       }   
  49.       public ByteArrayOutputStream getByteArrayOutputStream() {   
  50.          return myOutput;   
  51.       }   
  52.    }   
  53. }   
  54.   

转引结束

利用上面的WrapperResponse 类,写了一个filter,实现在jsp展现之前,获取即将展现的jsp的全部内容

获取这个内容的好处不多说(如果不知道就不用看下去了)

下面的代码利用filter,实现对字符串""的过滤,并转换成"邪教"显示

java 代码
  1. import java.io.IOException;   
  2.   
  3. import javax.servlet.Filter;   
  4. import javax.servlet.FilterChain;   
  5. import javax.servlet.FilterConfig;   
  6. import javax.servlet.ServletException;   
  7. import javax.servlet.ServletRequest;   
  8. import javax.servlet.ServletResponse;   
  9. import javax.servlet.http.HttpServletRequest;   
  10. import javax.servlet.http.HttpServletResponse;   
  11.   
  12. public class GavinFilter implements Filter    
  13. {   
  14.   
  15.     public void destroy()   
  16.     {   
  17.     // TODO 自动生成方法存根   
  18.        
  19.     }   
  20.   
  21.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException   
  22.     {   
  23.        
  24.     HttpServletRequest request = (HttpServletRequest)arg0;   
  25.     HttpServletResponse response = (HttpServletResponse)arg1;   
  26.     WrapperResponse wrapperResponse = new WrapperResponse(response);   
  27.     chain.doFilter(request, wrapperResponse);   
  28.     String html = wrapperResponse.getContent();   
  29.     response.getWriter().print(html.replaceAll("""邪教"));   
  30.        
  31.     }   
  32.   
  33.     public void init(FilterConfig arg0) throws ServletException   
  34.     {   
  35.     // TODO 自动生成方法存根   
  36.        
  37.     }   
  38.        
  39.     public static String getJspOutput(String jsppath, HttpServletRequest request, HttpServletResponse response) throws Exception   
  40.     {   
  41.     WrapperResponse wrapperResponse = new WrapperResponse(response);   
  42.     request.getRequestDispatcher(jsppath).include(request, wrapperResponse);   
  43.     return wrapperResponse.getContent();   
  44.     }   
  45.   
  46.   
  47. }  

完整代码参看附件(myeclipse)

  • filter.rar (342 KB)
  • 描述: 获取jsp页面内容示例
  • 下载次数: 614
分享到:
评论
3 楼 LinApex 2013-08-03  
pignut_wang 写道
这个做法在tomcat下面没有问题,但是转到weblogic就出问题了.
在输出截获的内容之前,原来的html已经被输出来了,正在想办法解决中.希望.


在吗?朋友? 这个问题是否有解决呢?
2 楼 lendo.du 2007-09-05  
这还是有个问题,我无法区分哪些是非法字符了,因为这样会替换所有的特殊字符,包括我需要的特殊字符。
1 楼 pignut_wang 2007-08-01  
这个做法在tomcat下面没有问题,但是转到weblogic就出问题了.
在输出截获的内容之前,原来的html已经被输出来了,正在想办法解决中.希望.

相关推荐

    使用Filter和HttpServletResponseWrapper进行页面缓存

    源代码 博文链接:https://msj.iteye.com/blog/179663

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出。 本文解决办法: 在前面所说的网络解决办法中,使用的是一种躲避的方式解决该问题,也就是置之不理。 这里提供一个...

    javax.servlet.jar下载

    javax/servlet/jsp/resources/jsp_2_0.xsd javax/servlet/jsp/resources/jsp_2_1.xsd javax/servlet/jsp/resources/jspxml.xsd javax/servlet/LocalStrings.properties javax.servlet....

    servlet2.4doc

    Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. -------------------------------------------------------------------------------- G ...

    JAVA J2EE 类库文档

    HttpServletResponseWrapper HttpSession HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingEvent HttpSessionBindingListener HttpSessionContext HttpSessionEvent ...

    servlet-api-2.4.jar.zip

    javax.servlet.http.HttpServletResponseWrapper javax.servlet.http.HttpSessionBindingListener javax.servlet.http.HttpSessionAttributeListener javax.servlet.http.HttpSessionActivationListener

Global site tag (gtag.js) - Google Analytics