1. 程式人生 > >繼承HttpServletRequestWrapper以實現在Filter中修改HttpServletRequest的引數

繼承HttpServletRequestWrapper以實現在Filter中修改HttpServletRequest的引數

一 簡介

如題所示,有時候我們需要在一個請求到達Controller之前能夠截獲其請求,並且根據其具體情況對 HttpServletRequest 中的引數進行過濾或者修改。這時,有的同學可能會想:我們是否可以在一個Filter中將 HttpServletRequest 裡的所有引數都取出來分別進行過濾然後再放回到該HttpServletRequest 中呢?

很顯然,在 HttpServletRequest 貌似只有 setAttribute(String name, Object o) 這個方法可以設定引數,但是我們經過嘗試之後可以發現:使用 setAttribute(String name, Object o) 方法來重新設定引數顯然是不行的,因為在Controller中獲取引數本質上還是呼叫的ServletRequest的public String getParameter(String name) 或者 public String[] getParameterValues(String name) 方法,因此想要達到“在Filter中修改HttpServletRequest的引數”的目的,顯然是需要使用裝飾模式來複寫這些方法才行的

在正式程式碼之前,我還是先簡單介紹下ServletRequest、HttpServletRequest、ServletRequestWrapper以及HttpServletRequestWrapper這幾個介面或者類之間的層次關係,並說明“繼承HttpServletRequestWrapper類以實現在Filter中修改HttpServletRequest的引數”這種方式的原理是什麼

如果我們從網上下載tomcat的原始碼並檢視的話,就可以很清楚地看到這幾個類之間的層次關係了,在eclipse中看,它們之間的層次關係是這樣的:

20160924212148

如果這個圖表還不夠清楚地話,我還畫了一個簡單的UML結構圖:

20160924212657710

注:因為我現在沒有下載專門的UML建模工具,因此就使用“畫圖”工具簡單地畫了一下類圖,同時這裡的ModifyParametersWrapper 是我後面舉例用到的的一個自定義的類

如果學過“裝飾模式”的童鞋可能已經發現了,上面這個關係毫無疑問是一個很標準的裝飾模式

  • ServletRequest    抽象元件
  • HttpServletRequest    抽象元件的一個子類,它的例項被稱作“被裝飾者”
  • ServletRequestWrapper    一個基本的裝飾類,這裡是非抽象的
  • HttpServletRequestWrapper    一個具體的裝飾者,當然這裡也繼承了HttpServletRequest這個介面,是為了獲取一些在ServletRequest中沒有的方法
  • ModifyParametersWrapper    同樣是 一個具體的裝飾者(PS:我自定義的一個類)

注:一個標準的裝飾模式的UML類圖是這樣的:

26160050

那麼問題來了,如何在Filter中修改後臺Controller中獲取到的HttpServletRequest中的引數?

答:很簡單,只需要在Filter中自定義一個類繼承於HttpServletRequestWrapper,並複寫getParameterNames、getParameter、getParameterValues等方法即可

二 程式碼實現

(1)自定義的過濾器ModifyParametersFilter.java:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697packagecn.zifangsky.filter;importjava.io.IOException;importjava.util.Enumeration;importjava.util.Map;importjava.util.Vector;importjavax.servlet.FilterChain;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjavax

相關推薦

繼承HttpServletRequestWrapper實現在Filter修改HttpServletRequest引數

一 簡介 如題所示,有時候我們需要在一個請求到達Controller之前能夠截獲其請求,並且根據其具體情況對 HttpServletRequest 中的引數進行過濾或者修改。這時,有的同學可能會想:我們是否可以在一個Filter中將 HttpServletReq

openstack 啟動winserver映象,需要在計算節點nova.conf修改預設引數block_device_allocate_retries 的引數修改為180 秒

用winserver images 映象 建立虛擬機器時,總是報錯,一開始懷疑是映象做的有問題 後臺檢視報錯日誌" 2018-05-03 15:33:40.801 30313 ERROR nova.compute.manager [instance: e083334c-1655-40ee-8

servlet過濾器防xss,sql注入.filter修改parameter引數

這中間起到最關鍵作用的就是HttpServletRequestWrapper 首先建立一個類繼承HttpServletRequestWrapper。然後重寫getAttribute,getParameter,getParameterValues,getParameterMa

PoW挖礦算法原理及其在比特幣、太坊實現

print 惡意攻擊 actions 規則 rom header() const state divisor PoW,全稱Proof of Work,即工作量證明,又稱挖礦。大部分公有鏈或虛擬貨幣,如比特幣、以太坊,均基於PoW算法,來實現其共識機制。即根據挖礦貢獻的有效工

MyBatissqlSession操作數據庫,不報錯但無法實現數據修改(增、改、刪)

修改 () brush light pub clas java bat job public void addCustomerTest() throws Exception { SqlSession sqlSession = MyBatisUtils.ge

關於FilterServletRequest強轉HttpServletRequest問題

htm net 類的方法 interface public 類型轉換 是我 執行 問題解決 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) t

Java使用elasticsearch搜尋引擎實現簡單、修改等操作

以下的操作環境為:jdk:1.8;elasticsearch:5.2.0 maven架包下載座標為: <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId&g

JavaScript繼承超全實現方式

1)物件冒充 紅色裡面三行程式碼最關鍵。相同方法會覆蓋 2)call方法方式《任何方法都有call()這個方法》 call 方法是Function物件中的方法,因此我們定義的每個函式都擁有該方法。可以通過函式名來呼叫call方法,call方法的第一個引數會被傳遞給函式中的this,

cssfilter過濾修改圖片

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style> .img{ /* filter

繼承HttpServletRequestWrapper 實現request中流的重複獲取

業務場景:需要列印所有的api請求的資訊到log中,在Filter中攔截了所有的api請求,但是列印的資訊中需要包含api請求的body,如果在Filter中使用request.getInputStream()來獲取流來得到body中的資訊,可以達到預期效果,但是流的獲取只能獲取一次,之後再獲取就獲

C++的位移操作實現檔案的壓縮(實現哈夫曼對檔案壓縮與解壓時做的一個小測試)

因為以前基本上沒用過位移操作,所以這裡做了一個小測試,加深了一下對位移的理解 相關概念:        因為C++中對檔案的操作常用的就是按位元組來進行讀取。下面對檔案的讀寫進行舉例(這是我常用的方式,大家也可以用其它方法讀取):   首先包含相關標頭檔案:     

02.區塊鏈共識演算法(2)PoW挖礦演算法原理及其在比特幣、太坊實現

PoW挖礦演算法原理及其在比特幣、以太坊中的實現 PoW,全稱Proof of Work,即工作量證明,又稱挖礦。 大部分公有鏈或虛擬貨幣,如比特幣、以太坊,均基於PoW演算法,來實現其共識機制。 即根據挖礦貢獻的有效工作,來決定貨幣的分配。 比特幣區塊 比特幣

PoW挖礦演算法原理及其在比特幣、太坊實現

原文地址:http://blog.51cto.com/11821908/2059711PoW,全稱Proof of Work,即工作量證明,又稱挖礦。大部分公有鏈或虛擬貨幣,如比特幣、以太坊,均基於PoW演算法,來實現其共識機制。即根據挖礦貢獻的有效工作,來決定貨幣的分配。 

Lua多重繼承的簡單實現

--多個table表中尋找對應key的值 function search(classes, key)     for i = 1, #classes do         local value = classes[i

在Android使用SharedPreferences儲存資料實現資料共享

在Android中,我們可以使用SharedPreferences來儲存資料,以實現資料的共享。 (以一個使用者登入為例) 簡介: 首先我們需要了解一下SharedPreferences類,Share

springmvc修改request的引數以及實現去空格功能

          最近發現不能修改request的引數內容,假如想要在request的paramMap裡面預設注入modifier內容,採用下面這種方法可以實現向request中修改引數,具體分析如下:        (1)繼承HttpServletRequestWrap

filter使用包裝類包裝request、response分別修改請求引數修改響應結果

工作需要,要將請求和響應做一些處理,使得瀏覽器展示結果可控。 首先是在filter中攔截一些請求,請求到達過濾器的時候,可以通過request獲取請求中的一些引數。這時候,你可以修改資料中的一部分,然後,讓過濾器放行。但是,執行中就發現問題了,整個請求直接400了。剛開始,

有關在html修改select標籤的option selected預設選中屬性實現

著急想要解決辦法的朋友可以直接看最後的內容:}一般我們使用select標籤時大概都會使用到option標籤來填充下拉框中的內容只有幾個固定的內容寫死在頁面還好,可能是這樣的:<select name="type"type="text">             

區塊鏈共識演算法(2)PoW挖礦演算法原理及其在比特幣、太坊實現

# PoW挖礦演算法原理及其在比特幣、以太坊中的實現PoW,全稱Proof of Work,即工作量證明,又稱挖礦。大部分公有鏈或虛擬貨幣,如比特幣、以太坊,均基於PoW演算法,來實現其共識機制。即根據挖礦貢獻的有效工作,來決定貨幣的分配。### 比特幣區塊比特幣區塊由區塊頭和該區塊所包含的交易列表組成。區塊

android通過程式碼實現檔案許可權修改

前提: 1.手機被root; 2.該app已經取得了root許可權。 目的: 試圖獲得系統資料夾下的檔案的讀寫許可權。 實現: 我們要使用的命令是: chmod -R 0777 xxx/xxx等系統目錄或檔案 命令解讀: 在Unix