Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 343|回复: 0

[servlet学习]利用过滤器修改响应

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 06:59:27 | 显示全部楼层 |阅读模式
    如果想用过滤器捕获Servlet对客户端的响应输出并且对它进行修改,就必须在响应被发送回客户端之前,在服务器端缓存这个响应。Servlet API为我们提供了:
         HttpServletResponseWrapper类
    利用它我们可以截获响应并在本地缓存,然后想做什么就做什么。
    下面是一个可重用的响应包装器:
    /*
    * CharResponseWrapper
    *@author Karl Moss
    */ package com.omh.filters; import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
      
      
       
       
         
       

         
       
      
    1. /**
    2. * Simple response wrapper that utilizes a local CharArrayWriter
    3. * for output
    4. */
    5. public class CharResponseWrapper
    6.         extends HttpServletResponseWrapper
    7. {
    8.     protected CharArrayWriter charWriter;//将响应缓存在这个写入器中
    9.     protected PrintWriter writer;
    10.     protected boolean getOutputStreamCalled;
    11.     protected boolean getWriterCalled;
    12.     public CharResponseWrapper(HttpServletResponse response)
    13.     {
    14.         super(response);
    15.         // Create the writer
    16.         charWriter = new CharArrayWriter();
    17.     }
    18.     public ServletOutputStream getOutputStream()
    19.         throws IOException
    20.     {
    21.         // Can"t call getOutputStream if getWriter
    22.         // has already been called
    23.         if (getWriterCalled)
    24.         {
    25.             throw new IllegalStateException(
    26.                     "getWriter already called");
    27.         }
    28.         getOutputStreamCalled = true;
    29.         return super.getOutputStream();
    30.     }
    31.     public PrintWriter getWriter()
    32.         throws IOException
    33.     {
    34.         if (writer != null)
    35.         {
    36.             return writer;
    37.         }
    38.         // Can"t call getWriter if getOutputStream
    39.         // has already been called
    40.         if (getOutputStreamCalled)
    41.         {
    42.             throw new IllegalStateException(
    43.                     "getOutputStream already called");
    44.         }
    45.         getWriterCalled = true;
    46.         writer = new PrintWriter(charWriter);
    47.         return writer;
    48.     }
    49.     public String toString()//将响应数据用字符串返回
    50.     {
    51.         String s = null;
    52.         // Only return a String if the writer was
    53.         // used.
    54.         if (writer != null)
    55.         {
    56.             s = charWriter.toString();
    57.         }
    58.         return s;
    59.     }
    60.    
    61.    public char[] toCharArray(){//将响应数据以字符数组返回
    62.                 return(charWriter.toCharArray());
    63.   }
    64. }
    复制代码
    利用上面包装器把一个servlet响应全部改变成大写形式:
    1. /*
    2. * UpperCaseFilter
    3. * @author  Karl Moss
    4. */
    5. package com.omh.filters;
    6. import javax.servlet.*;
    7. import javax.servlet.http.*;
    8. import java.io.*;
    9. /**
    10. * Filter that uses a response wrapper to convert all
    11. * output to upper case
    12. */
    13. public class UpperCaseFilter
    14.         implements Filter
    15. {
    16.     protected FilterConfig config;
    17.     public void init(FilterConfig config)
    18.         throws ServletException
    19.     {
    20.         // Save the config object
    21.         this.config = config;
    22.     }
    23.     public void destroy()
    24.     {
    25.     }
    26.     public void doFilter(ServletRequest request,
    27.                          ServletResponse response,
    28.                          FilterChain chain)
    29.         throws ServletException, IOException
    30.     {
    31.         ServletResponse newResponse = response;
    32.         // If this is an HttpRequest, wrap the response
    33.         // with our CharArrayWriter so that we can get
    34.         // the contents
    35.         if (request instanceof HttpServletRequest)
    36.         {
    37.             newResponse = new CharResponseWrapper(
    38.                     (HttpServletResponse) response);
    39.         }
    40.         // Invoke the next filter/servlet in the chain
    41.         // using (perhaps) a wrapped response
    42.         chain.doFilter(request, newResponse);
    43.         if (newResponse instanceof CharResponseWrapper)
    44.         {
    45.             // Get the contents of the output. A String
    46.             // is returned only if a Writer was used,
    47.             // indicating text output. If getOutputStream
    48.             // was used the output will go to the "real"
    49.             // underlying output stream back to the client
    50.             String text = newResponse.toString();
    51.             if (text != null)
    52.             {
    53.                 text = text.toUpperCase();
    54.                 // Now write the output to the real
    55.                 // output stream that goes back to
    56.                 // the client
    57.                 response.getWriter().write(text);
    58.             }
    59.         }
    60.     }
    61. }
    62.             
    复制代码
    过滤器配置: <filter>
    <filter-name>Upper Case Filter</filter-name>
    <filter-class>com.omh.filters.UpperCaseFilter</filter-class>
    </filter>  <filter-mapping>
    <filter-name>Upper Case Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      运行图:   

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/10/065926781.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-23 01:14 , Processed in 0.407409 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表