1. 程式人生 > >Filter的使用(對請求和響應資料進行替換)

Filter的使用(對請求和響應資料進行替換)

一、過濾器配置web.xml

 <filter>
        <filter-name>GuestbookFilter</filter-name>
        <filter-class>test.GuestbookFilter</filter-class>
        <init-param>
            <!-- 配置不雅字句內容的替換檔案,內容如:fuck=****,每行一句 -->
            <param-name>word_file</param-name>
            <param-value>/WEB-INF/word.txt</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <!-- 儲存過濾 -->
        <filter-name>GuestbookFilter</filter-name>
        <url-pattern>/process.jsp</url-pattern>
    </filter-mapping>
    
     <filter-mapping>
         <!-- 顯示過濾 -->
        <filter-name>GuestbookFilter</filter-name>
        <url-pattern>/index.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

二、過濾器編寫GuestbookFilter.java,利用MyRequestWrapper和MyResponseWrapper來替換請求中的特殊字元和響應中的不雅字句

package test;

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

public class GuestbookFilter implements Filter
{
    private static final String WORD_FILE="word_file";
    HashMap<String,String> hm=new HashMap<String,String>();
    
    /**
     * 在init()方法中,讀取儲存了不雅字句和替換內容的檔案,
     * 並以不雅字句作為key,替換內容作為value,儲存到Hashmap物件中。
     */
    public void init(FilterConfig filterConfig) throws ServletException{   
        String configPath=filterConfig.getInitParameter(WORD_FILE);
        ServletContext sc=filterConfig.getServletContext();
        String filePath=sc.getRealPath(configPath);
        try{
            FileReader fr=new FileReader(filePath);
            BufferedReader br=new BufferedReader(fr);
            String line;
            while(null!=(line=br.readLine())){
                String[] strTemp=line.split("=");
                hm.put(strTemp[0],strTemp[1]);
            }
        }catch(IOException ie){
            throw new ServletException("讀取過濾檔案資訊出錯!");
        }
    }
    public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
                  throws IOException, ServletException{
        HttpServletRequest httpReq=(HttpServletRequest)request;
        HttpServletResponse httpResp=(HttpServletResponse)response;
        //得到請求和響應物件的封裝類物件。
        MyRequestWrapper reqWrapper=new MyRequestWrapper(httpReq);
        MyResponseWrapper respWrapper=new MyResponseWrapper(httpResp);
        chain.doFilter(reqWrapper,respWrapper);
        String content = new String(respWrapper.toByteArray());
        String result=replaceText(content);
        httpResp.setContentType("text/html;charset=GB2312");
        PrintWriter out = httpResp.getWriter();
        out.println(result);
        out.close();
    }
    
    /**
     * 對內容中的不雅字句進行過濾。
     */
    public String replaceText(String content) throws IOException{
        StringBuffer sb=new StringBuffer(content);
        Set keys=hm.keySet();
        Iterator it=keys.iterator();
        while(it.hasNext()){
            String key=(String)it.next();
            int index=sb.indexOf(key);
            if(-1!=index){
                sb.replace(index,index+key.length(),(String)hm.get(key));
            }
        }
        return sb.toString();
    }
    public void destroy(){}
}

三、請求引數過濾MyRequestWrapper.java,替換請求中的特殊字元

package test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class MyRequestWrapper extends HttpServletRequestWrapper{
    public MyRequestWrapper(HttpServletRequest request){
        super(request);
    }
    /**
     * 覆蓋基類的getParameter()方法,對請求引數的值進行過濾。
     */
    public java.lang.String getParameter(java.lang.String name){
        String value=super.getParameter(name);
        if(null!=value)
            return toHtml(value.trim());
        else
            return null;
    }
    /**
     * 將特殊字元轉換為對應的實體引用或字元引用。
     */
    private String toHtml(String str){
        if(str==null)
            return null;
        StringBuffer sb = new StringBuffer();
        int len = str.length();
        for (int i = 0; i < len; i++){
            char c = str.charAt(i);
            switch(c){                  
                case ' ':sb.append("&nbsp;");break;
                case '\n':sb.append("<br>");break;
                case '\r':break;
                case '\'':sb.append("&#39;");break;
                case '<': sb.append("&lt;");break;
                case '>':sb.append("&gt;");break;
                case '&':sb.append("&amp;");break;
                case '"':sb.append("&#34;");break;
                case '\\':sb.append("&#92;");break;
                default:sb.append(c);
            }
        }
        return sb.toString();
    }
}
四、對響應資料進行過濾MyResponseWrapper.java,替換響應中的不雅字句,用ByteArrayServletOutputStream類的物件替換Web容器中的物件

package test;

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

public class MyResponseWrapper extends HttpServletResponseWrapper{
    private ByteArrayOutputStream baos;
    private ByteArrayServletOutputStream basos;
    private PrintWriter pw;
    public MyResponseWrapper(HttpServletResponse response){
        super(response);
        //建立ByteArrayOutputStream物件。
        baos=new ByteArrayOutputStream();
        //用ByteArrayOutputStream物件作為引數,
        //構造ByteArrayServletOutputStream物件。
        basos=new ByteArrayServletOutputStream(baos);
        //用ByteArrayOutputStream物件作為引數,
        //構造PrintWriter物件。
        pw=new PrintWriter(baos);
    }
    public PrintWriter getWriter(){
        return pw;
    }
    public ServletOutputStream getOutputStream(){
        return basos;
    }
    /**
     * 以位元組陣列的形式返回輸出流緩衝區中的內容。
     */
    public byte[] toByteArray(){
        return baos.toByteArray();
    }
}

五、替換Web容器中的ServletOutputStream物件ByteArrayServletOutputStream.java

package test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletOutputStream;

//用該類的物件替換HttpServletResponse.getOutputStream()方法返回的ServletOutputStream物件
public class ByteArrayServletOutputStream extends ServletOutputStream{
    ByteArrayOutputStream baos;
    ByteArrayServletOutputStream(ByteArrayOutputStream baos){
        this.baos = baos;
    }
    public void write(int data) throws IOException{
        baos.write(data);
    }
}

相關推薦

Filter的使用請求響應資料進行替換

一、過濾器配置web.xml  <filter>         <filter-name>GuestbookFilter</filter-name>         <filter-class>test.GuestbookF

filter 用於請求響應進行預處理操作

filter 用於對請求和響應進行預處理操作 一個 filter 可以針對多個請求做過濾,url mapping 配置為 /* 自定義 filter 需要實現 Filter 介面,預處理工作在 doFilter 中完成 1. 強制轉換 re

原生js---ajax的封裝外掛.js---getpost做了相容

function ajax(method,url,data,fn){ // 1、建立物件 var xhr=null; try{ xhr=new XMLHttpRequest(); }catch(e){ xhr=new ActiveXObject("Micr

Hadoop到底是什麼一些現有文件進行整合

大資料是個鋪天蓋地的詞,而談論大資料又不可避免地要提到Hadoop,Hadoop到底是什麼玩意,以及有何功用。 Hadoop是Apache軟體基金會管理的開源軟體平臺,但Hadoop到底是什麼呢?簡單來說,Hadoop是在分散式伺服器叢集上儲存海量資料並執行分散式分析應用的一種方法。Ha

Redis大總結之三:SORT命令 列表|集合|有序集合 進行排序

SORT命令 對 列表|集合|有序集合 進行排序 對列表進行排序: 127.0.0.1:6379[5]> lrange myList 0 -1 1) "1" 2) "2" 3) "4" 4) "3" 5) "5" 127.0.0.1:6379[5]> sort

802.11與802.3資料幀轉換即有線無線資料幀轉換

原文直接摘自《802.11無線網路權威指南》第二版,僅僅作為個人記錄下。無線到有線(802.11至802.3)當基站的無線介面接收到準備傳送至有線網路的幀,基站就必須在兩種介質間橋送幀。非正式來講,以下是基站必須進行的一系列工作:1. 當基站接收到一個幀,首先會檢測該幀基本

robotframework 學習2 :使用RIDE進行介面測試之傳送請求接收資料斷言

一、RIDE的介紹:         RIDE是robotframework圖形操作前端,也可以理解為一種編輯器,它以cell的形式來進行定義資料和方法,返回結果等,我們可以使用它進行建立測試用例和編寫測試指令碼,並且執行自動化測試。  

HTTP請求響應2:方法Method

trace 行處理 診斷 ack 中間 delete nds 最優 eas 方法表明了client希望server對資源運行的動作。經常使用的方法包含:GET、HEAD、POST、PUT、TRACE、OPTIONS和DELETE,每一個server能夠實現這些方法中

使用 自定義的 ContentProvider 進行應用間的資料互動另一個APP當前的應用資料進行修改,查詢,getType()等內容的講解

本部落格內容 應用B 對 應用A的資料庫資料進行插入和查詢(其他操作簡略不寫) bookProject 應用A 看一下目錄結構 Book_TABLE.java 關鍵點:private static final String BOOK_DB = "create

Spring Boot中如何擴充套件XML格式請求響應的支援

在Spring Boot中,對於XML格式的請求要如何快速的在Controller中包裝成物件,以及如何再以XML的格式返回一個物件呢? 實現原理:訊息轉換器(Message Converter) 在擴充套件上述問題之前,我們先要知道Spring Boot中處理HTTP請求的實現是採用的Sp

HTTP協議5HTTP請求響應

之前曾介紹過,所有的HTTP通訊都被構造成一對HTTP請求和HTTP響應,HTTP協議的請求與響應報文都是由“首部header”和“主體body”兩部分組成的。其中主體部分是請求和響應的資料,首部部分則規定了請求和響應的內容格式。 對於HTTP請求報文,主要由三部分組成:請求行、請求頭、請求正文。在請求頭和

HTTP學習記錄:四、頭資訊請求響應

學習資源主要為:@小坦克HTTP相關部落格 一、請求頭資訊(Request Header) 請求頭資訊包含比較多,如下: 1、Cache頭域   if-modified-Since   作用:把瀏覽器端快取頁面的最後修改時間傳送到伺服器去,伺服器會把這個時間與伺服器上的實際檔案的最後修改時間進行對比

JSONP 跨域Ajax請求,利用js獲取到的資料進行處理.

先看看獲取到的資料: 前端內容ajax 使用jsonp跨域請求方式,理解如下: JSONP本質: 利用script標籤src跨域訪問,獲得一個回撥函式,再利用回撥函式引數內容獲取返回的資料args img src   亦可以, Form src會被本地同源策略阻

layui中table中的資料進行判斷0、1轉換為提示資訊

需要把“1”改成中文漢字: 在 done方法裡面進行資料渲染: layui.use('table', function(){ var table = layui.table ,form = layui.form; tab

MD5 加密解密類通過Key 資料進行加密直接複製使用

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.spec.S

使用 自定義的 ContentProvider 進行應用間的資料互動另一個APP當前的應用資料進行修改,查詢,getType()等內容的講解

本部落格內容 應用B 對 應用A的資料庫資料進行插入和查詢(其他操作簡略不寫) bookProject 應用A 看一下目錄結構 Book_TABLE.java 關鍵點:private static final String BOOK_DB = "create

請求響應資料格式

http協議: 超文字傳輸協議, 瀏覽器與伺服器通訊的約束, 基於 tcp ****瀏覽器向伺服器傳送的請求格式如下: ******************************* # 請求方式 瀏覽器請求頁面 GET / HTTP/1.1 # 請求目標 Host: 127.0.0.1:8080

http協議基礎請求響應報文的構成

http協議用於客戶端和伺服器之間的通訊,請求訪問資源的一方稱為客戶端,而提供資源響應的一方稱為伺服器端。 下面就是客戶端和服務端之間簡單的通訊過程 PS:請求必須從客戶端建立通訊,服務端沒收到請求之前不會發送響應 下面先來說說請求的構成: 1)請求方法URI協議/版本  2)請求頭(

SwiftyJSON 網路請求來的資料進行解析或者轉為modul

JSON是移動端開發常用的應用層資料交換協議。最常見的場景便是,客戶端向服務端發起網路請求,服務端返回JSON文字,然後客戶端解析這個JSON文字,再把對應資料展現到頁面上。 但在程式設計的時候,處理JSON是一件麻煩事。在不引入任何輪子的情況下,我們通常需要先把JSON轉為

OAuth 2.0系列教程十一 客戶端證書請求響應

作者:Jakob Jenkov   譯者:林浩    校對:郭蕾 客戶端證書授權包含下面的引數: grant_type 必須。必須設定到客戶端證書中。 scope 可選。授權的作用域。 客戶端授權響應: 客戶端授權響應包含下面的引數: { "access_token" :