Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          導航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          公告


          我的blog中的部分資源是來自于網絡上,如果你認為侵犯了你的權利,請及時聯系jelver#163.com,我會盡快刪除!另外如果要留言最好通過郵件的形式跟我交流因為我不是很經常寫文章,前面有的朋友留言好久了我才發現,所以對不住大家,現在留下MSN:jelver#163.com和QQ:253840881,歡迎交流! (用@代替#)

          隨筆分類

          文章分類

          隨筆檔案

          文章檔案

          相冊

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          利用過濾器修改響應(轉)

           如果想用過濾器捕獲servlet對客戶端的響應輸出并且對它進行修改,就必須在響應被發送回客戶端之前,在服務器端緩存這個響應。Servlet API為我們提供了:
              HttpServletResponseWrapper類
          利用它我們可以截獲響應并在本地緩存,然后想做什么就做什么。
          下面是一個可重用的響應包裝器:

          /*
          * CharResponseWrapper
          *@author Karl Moss
          */

          package com.omh.filters;

          import javax.servlet.*;
          import javax.servlet.http.*;
          import java.io.*;

          /**
          * Simple response wrapper that utilizes a local CharArrayWriter
          * for output
          */
          public class CharResponseWrapper
          extends HttpServletResponseWrapper
          {
          protected CharArrayWriter charWriter;//將響應緩存在這個寫入器中
          protected PrintWriter writer;
          protected boolean getOutputStreamCalled;
          protected boolean getWriterCalled;
          public CharResponseWrapper(HttpServletResponse response)
          {
          super(response);
          // Create the writer
          charWriter = new CharArrayWriter();
          }
          public ServletOutputStream getOutputStream()
          throws IOException
          {
          // Can't call getOutputStream if getWriter
          // has already been called
          if (getWriterCalled)
          {
          throw new IllegalStateException(
          "getWriter already called");
          }
          getOutputStreamCalled = true;
          return super.getOutputStream();
          }
          public PrintWriter getWriter()
          throws IOException
          {
          if (writer != null)
          {
          return writer;
          }
          // Can't call getWriter if getOutputStream
          // has already been called
          if (getOutputStreamCalled)
          {
          throw new IllegalStateException(
          "getOutputStream already called");
          }
          getWriterCalled = true;
          writer = new PrintWriter(charWriter);
          return writer;
          }
          public String toString()//將響應數據用字符串返回
          {
          String s = null;
          // Only return a String if the writer was
          // used.
          if (writer != null)
          {
          s = charWriter.toString();
          }
          return s;
          }
          
          public char[] toCharArray(){//將響應數據以字符數組返回 return(charWriter.toCharArray());
          } }

          利用上面包裝器把一個servlet響應全部改變成大寫形式:

           /*
          * UpperCaseFilter
          * @author  Karl Moss
          */
          package com.omh.filters;
          import javax.servlet.*;
          import javax.servlet.http.*;
          import java.io.*;
          /**
          * Filter that uses a response wrapper to convert all
          * output to upper case
          */
          public class UpperCaseFilter
          implements Filter
          {
          protected FilterConfig config;
          public void init(FilterConfig config)
          throws ServletException
          {
          // Save the config object
          this.config = config;
          }
          public void destroy()
          {
          }
          public void doFilter(ServletRequest request,
          ServletResponse response,
          FilterChain chain)
          throws ServletException, IOException
          {
          ServletResponse newResponse = response;
          // If this is an HttpRequest, wrap the response
          // with our CharArrayWriter so that we can get
          // the contents
          if (request instanceof HttpServletRequest)
          {
          newResponse = new CharResponseWrapper(
          (HttpServletResponse) response);
          }
          // Invoke the next filter/servlet in the chain
          // using (perhaps) a wrapped response
          chain.doFilter(request, newResponse);
          if (newResponse instanceof CharResponseWrapper)
          {
          // Get the contents of the output. A String
          // is returned only if a Writer was used,
          // indicating text output. If getOutputStream
          // was used the output will go to the "real"
          // underlying output stream back to the client
          String text = newResponse.toString();
          if (text != null)
          {
          text = text.toUpperCase();
          // Now write the output to the real
          // output stream that goes back to
          // the client
          response.getWriter().write(text);
          }
          }
          }
          }
          

          過濾器配置:

          <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>

          運行圖:

          posted on 2007-10-11 13:04 都市淘沙者 閱讀(455) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          主站蜘蛛池模板: 静乐县| 当阳市| 札达县| 宁海县| 襄汾县| 光山县| 石河子市| 织金县| 沧州市| 韶关市| 贡觉县| 永春县| 青阳县| 富民县| 开江县| 滦南县| 乌恰县| 通河县| 陈巴尔虎旗| 西和县| 大竹县| 宁远县| 威海市| 洪湖市| 镶黄旗| 门头沟区| 安宁市| 大冶市| 高阳县| 永州市| 大城县| 璧山县| 桓台县| 红河县| 青浦区| 台山市| 堆龙德庆县| 三门峡市| 错那县| 门源| 沁源县|