優(yōu)化SpringBoot中HttpServletRequest參數(shù)處理的實(shí)用工具類

在Spring Boot應(yīng)用中,我們經(jīng)常需要對HttpServletRequest中的參數(shù)進(jìn)行處理,以滿足特定的業(yè)務(wù)需求或增強(qiáng)系統(tǒng)的安全性。本文介紹了一個實(shí)用的工具類——ParameterRequestWrapper,通過該類,我們可以更方便地對請求參數(shù)進(jìn)行定制化處理。


1. 背景

在實(shí)際項(xiàng)目中,我們經(jīng)常會遇到對請求參數(shù)進(jìn)行特殊處理的需求,例如去除空字符串參數(shù)、處理JSON格式的POST請求等。為了更靈活地處理這些情況,我們創(chuàng)建了ParameterRequestWrapper類,它繼承自HttpServletRequestWrapper,并在構(gòu)造方法中對請求參數(shù)進(jìn)行了初始化和定制化處理。


2. 功能介紹

2.1 參數(shù)去空格處理

在處理頁面提交的參數(shù)時,有時會出現(xiàn)空字符串參數(shù),如果不進(jìn)行處理,這些空字符串可能會對SQL查詢等操作產(chǎn)生不良影響。為了解決這個問題,我們在modifyParameterValues方法中去除了頁面提交的空字符串參數(shù),確保參數(shù)的有效性。


```

public void modifyParameterValues() {

? ? // 去除頁面提交出現(xiàn)的空字符串參數(shù),防止SQL查詢默認(rèn)帶進(jìn)去,當(dāng)作參數(shù),造成頁面列表不展示

? ? params.entrySet().removeIf(e -> "".equals(e.getValue()[0]));

? ? Set<String> set = params.keySet();

? ? for (String key : set) {

? ? ? ? String[] values = params.get(key);

? ? ? ? values[0] = values[0].trim();

? ? ? ? params.put(key, values);

? ? }

}

```

2.2 JSON格式的POST請求處理

對于POST請求,特別是JSON格式的POST請求,我們通過重寫getInputStream方法,將請求中的JSON參數(shù)進(jìn)行處理,去除兩端空格,并輸出日志,方便調(diào)試。


```

@Override

public ServletInputStream getInputStream() throws IOException {

? ? // 非json類型,直接返回

? ? if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {

? ? ? ? return super.getInputStream();

? ? }

? ? // 為空,直接返回

? ? String json = IOUtils.toString(super.getInputStream(), StandardCharsets.UTF_8);

? ? if (StringUtils.isEmpty(json)) {

? ? ? ? return super.getInputStream();

? ? }

? ? log.info("去除POST請求數(shù)據(jù)兩端的空格前參數(shù):" + json);

? ? Map<String, Object> map = StringJsonUtils.jsonStringToMap(json);

? ? log.info("去除POST請求數(shù)據(jù)兩端的空格后參數(shù):" + JSON.toJSONString(map));

? ? ByteArrayInputStream bis = new ByteArrayInputStream(JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8));

? ? return new MyServletInputStream(bis);

}

```

3. 使用示例

要使用ParameterRequestWrapper,只需在Controller中將HttpServletRequest替換為該類的實(shí)例即可,如下所示:

```

@PostMapping("/example


public ResponseEntity<String> example(ParameterRequestWrapper request) {

? ? // 處理定制化的HttpServletRequest,可以直接使用request.getParameter等方法

? ? // ...

? ? return ResponseEntity.ok("Success");

}

```

通過這樣的替換,我們就可以在請求到達(dá)Controller之前對參數(shù)進(jìn)行定制化處理,更好地適應(yīng)項(xiàng)目的需求。


4. 總結(jié)

ParameterRequestWrapper是一個簡單而實(shí)用的工具類,通過對HttpServletRequest的定制化處理,能夠滿足一些特殊場景下的需求。在實(shí)際項(xiàng)目中,根據(jù)具體情況,我們可以進(jìn)一步擴(kuò)展該類,以滿足更復(fù)雜的參數(shù)處理需求。希望這個工具類能夠幫助到開發(fā)者更方便地處理請求參數(shù),提升項(xiàng)目的可維護(hù)性和靈活性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容