繼承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中看,它們之間的層次關係是這樣的:
如果這個圖表還不夠清楚地話,我還畫了一個簡單的UML結構圖:
注:因為我現在沒有下載專門的UML建模工具,因此就使用“畫圖”工具簡單地畫了一下類圖,同時這裡的ModifyParametersWrapper 是我後面舉例用到的的一個自定義的類
如果學過“裝飾模式”的童鞋可能已經發現了,上面這個關係毫無疑問是一個很標準的裝飾模式:
- ServletRequest 抽象元件
- HttpServletRequest 抽象元件的一個子類,它的例項被稱作“被裝飾者”
- ServletRequestWrapper 一個基本的裝飾類,這裡是非抽象的
- HttpServletRequestWrapper 一個具體的裝飾者,當然這裡也繼承了HttpServletRequest這個介面,是為了獲取一些在ServletRequest中沒有的方法
- ModifyParametersWrapper 同樣是 一個具體的裝飾者(PS:我自定義的一個類)
注:一個標準的裝飾模式的UML類圖是這樣的:
那麼問題來了,如何在Filter中修改後臺Controller中獲取到的HttpServletRequest中的引數?
答:很簡單,只需要在Filter中自定義一個類繼承於HttpServletRequestWrapper,並複寫getParameterNames、getParameter、getParameterValues等方法即可
二 程式碼實現
(1)自定義的過濾器ModifyParametersFilter.java:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | packagecn.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算法,來實現其共識機制。即根據挖礦貢獻的有效工 MyBatis中sqlSession操作數據庫,不報錯但無法實現數據修改(增、改、刪)修改 () brush light pub clas java bat job public void addCustomerTest() throws Exception { SqlSession sqlSession = MyBatisUtils.ge 關於Filter中ServletRequest強轉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, css中filter過濾修改圖片<!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 |