Java中的HttpServletRequestWrapper用法解析
一.HttpServletRequestWrapper
1.為什么會(huì)有HttpServletRequestWrapper類(lèi)
HttpServletRequest 對(duì)參數(shù)值的獲取實(shí)際調(diào)的是org.apache.catalina.connector.Request,沒(méi)有提供對(duì)應(yīng)的set方法修改屬性,所以不能對(duì)前端傳來(lái)的參數(shù)進(jìn)行修改,實(shí)際場(chǎng)所像過(guò)濾xss攻擊,獲取認(rèn)證token統(tǒng)一去除token前綴等需要進(jìn)行請(qǐng)求參數(shù)的處理,此時(shí)HttpServletRequestWrapper 就應(yīng)運(yùn)而生。
2.原理
HttpServletRequestWrapper 采用裝飾者模式對(duì)HttpServletRequest進(jìn)行包裝,我們可以通過(guò)繼承HttpServletRequestWrapper 類(lèi)去重寫(xiě)getParameterValues,getParameter等方法,實(shí)際還是調(diào)用HttpServletRequest的相對(duì)應(yīng)方法,但是可以對(duì)方法的結(jié)果進(jìn)行改裝。
3.實(shí)戰(zhàn)
給所有方法自動(dòng)提供token字段參數(shù)
3.1 新增wrapper類(lèi)
/** * @Auther * @Date 2023-06-06 8:38 */ public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { /** * 定義參數(shù) */ private Map<String, String[]> parameterMaps; /** * @param request */ public MyHttpServletRequestWrapper(HttpServletRequest request) { super(request); parameterMaps = new HashMap<>(request.getParameterMap()); } @Override public String[] getParameterValues(String name) { String[] values = parameterMaps.get(name); if (values == null) { values = super.getParameterValues(name); } return values; } /** * 設(shè)置參數(shù) * @param name * @param value */ public void setParameter(String name, String... value) { parameterMaps.put(name, value); } }
3.2新增 filter類(lèi)傳遞MyHttpServletRequestWrapper
/** * @Auther * @Date 2023-06-06 8:38 */ @WebFilter(urlPatterns = {"/**"}) public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { MyHttpServletRequestWrapper MyHttpServletRequest = new MyHttpServletRequestWrapper((HttpServletRequest) request); MyHttpServletRequest.setParameter("name", "zhangsan"); chain.doFilter(MyHttpServletRequest, response); } }
3.3結(jié)果
結(jié)果可以看到 name前端沒(méi)傳,但是因?yàn)槲覀冊(cè)谶^(guò)濾器設(shè)值了name的值所以在controller打印出了name的值,此方法也可以去修改原有參數(shù)的值。
二.HttpServletRequest的getInputStream方法和getParameter方法
根據(jù)Servlet規(guī)范,如果同時(shí)滿足下列條件,則請(qǐng)求體(Entity)中的表單數(shù)據(jù),將被填充到request的parameter集合中(request.getParameter系列方法可以讀取相關(guān)數(shù)據(jù)):
- 這是一個(gè)HTTP/HTTPS請(qǐng)求
- 請(qǐng)求方法是POST(querystring無(wú)論是否POST都將被設(shè)置到parameter中)
- 請(qǐng)求的類(lèi)型(Content-Type頭)是application/x-www-form-urlencoded
- Servlet調(diào)用了getParameter系列方法
如果上述條件沒(méi)有同時(shí)滿足,則相關(guān)的表單數(shù)據(jù)不會(huì)被設(shè)置進(jìn)request的parameter集合中,相關(guān)的數(shù)據(jù)可以通過(guò)request.getInputStream()來(lái)訪問(wèn)。反之,如果上述條件均滿足,相關(guān)的表單數(shù)據(jù)將不能再通過(guò)request.getInputStream()來(lái)讀取。
到此這篇關(guān)于Java中的HttpServletRequestWrapper用法解析的文章就介紹到這了,更多相關(guān)HttpServletRequestWrapper用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中的HttpServletRequest接口詳細(xì)解讀
- Java獲取HttpServletRequest的三種方法詳解
- Java service層獲取HttpServletRequest工具類(lèi)的方法
- java通過(guò)HttpServletRequest獲取post請(qǐng)求中的body內(nèi)容的方法
- java HttpServletRequest和HttpServletResponse詳解
- java接口返回參數(shù)按照請(qǐng)求參數(shù)進(jìn)行排序方式
- Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解
- Java如何獲取HttpServletRequest請(qǐng)求參數(shù)
相關(guān)文章
IDEA 2020.1 for Mac 下載安裝配置及出現(xiàn)的問(wèn)題小結(jié)
這篇文章主要介紹了IDEA 2020.1 for Mac 下載安裝配置及出現(xiàn)的問(wèn)題小結(jié),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03編譯大型Java項(xiàng)目class沖突導(dǎo)致報(bào)錯(cuò)的解決方案
這篇文章給大家盤(pán)點(diǎn)編譯大型項(xiàng)目class沖突導(dǎo)致報(bào)錯(cuò)的解決方案,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10Java編程實(shí)現(xiàn)計(jì)算兩個(gè)日期的月份差實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)計(jì)算兩個(gè)日期的月份差實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01前后端分離跨域springBoot跨域有效解決問(wèn)題
這篇文章主要介紹了前后端分離跨域springBoot跨域有效解決問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java.net.ConnectException: Connection refused問(wèn)題解決辦法
這篇文章主要介紹了java.net.ConnectException: Connection refused問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12java中將漢字轉(zhuǎn)換成拼音的實(shí)現(xiàn)代碼
java中將漢字轉(zhuǎn)換成拼音的實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10Spring Boot使用Servlet及Filter過(guò)程詳解
這篇文章主要介紹了Spring Boot使用Servlet及Filter過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07