Springboot如何使用filter對request body參數(shù)進(jìn)行校驗(yàn)
使用filter對request body參數(shù)進(jìn)行校驗(yàn)
@Slf4j public class ParameterCheckServletRequestWrapper extends HttpServletRequestWrapper { private byte[] requestBody; private Charset charSet; public ParameterCheckServletRequestWrapper(HttpServletRequest request) { super(request); //緩存請求body try { String requestBodyStr = getRequestPostStr(request); if (StringUtils.isNotBlank(requestBodyStr)) { JSONObject resultJson = JSONObject.fromObject(requestBodyStr.replace("\"", "'")); Object[] obj = resultJson.keySet().toArray(); for (Object o : obj) { resultJson.put(o, StringUtils.trimToNull(resultJson.get(o).toString())); } requestBody = resultJson.toString().getBytes(charSet); } else { requestBody = new byte[0]; } } catch (IOException e) { log.error("", e); } } public String getRequestPostStr(HttpServletRequest request) throws IOException { String charSetStr = request.getCharacterEncoding(); if (charSetStr == null) { charSetStr = "UTF-8"; } charSet = Charset.forName(charSetStr); return StreamUtils.copyToString(request.getInputStream(), charSet); } /** * 重寫 getInputStream() */ @Override public ServletInputStream getInputStream() { if (requestBody == null) { requestBody = new byte[0]; } final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody); return new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() { return byteArrayInputStream.read(); } }; } /** * 重寫 getReader() */ @Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(getInputStream())); } }
public class ParameterCheckFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ParameterCheckServletRequestWrapper myWrapper = new ParameterCheckServletRequestWrapper((HttpServletRequest) servletRequest); filterChain.doFilter(myWrapper, servletResponse); } @Override public void destroy() { } }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean authFilterRegistrationBean() { FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setName("parameterCheckFilter"); registrationBean.setFilter(new ParameterCheckFilter()); registrationBean.setOrder(1); registrationBean.addUrlPatterns("/*"); return registrationBean; } }
通過filter修改body參數(shù)的思路
知識(shí)點(diǎn)
1、HttpServletRequestWrapper
2、filter
步驟
1、新建MyHttpServletRequestWrapper繼承HttpServletRequestWrapper
2、講傳入的body賦值給自己的body(如下)
package com.orisdom.modules.common.filter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.orisdom.modules.monitor.dto.input.MonitorPointQueryPara; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; /** ?* @author xiaokang ?* @description ?* @date 2021/6/11 10:56 ?*/ public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { ? ? private String tempBody; ? ? public MyHttpServletRequestWrapper(HttpServletRequest request) { ? ? ? ? super(request); ? ? ? ? this.tempBody = getBody(request); ? ? ? ? System.out.println(tempBody); ? ? } ? ? /** ? ? ?* 獲取請求體 ? ? ?* @param request 請求 ? ? ?* @return 請求體 ? ? ?*/ ? ? private String getBody(HttpServletRequest request) { ? ? ? ? try { ? ? ? ? ? ? ServletInputStream stream = request.getInputStream(); ? ? ? ? ? ? String read = ""; ? ? ? ? ? ? StringBuilder stringBuilder = new StringBuilder(); ? ? ? ? ? ? byte[] b = new byte[1024]; ? ? ? ? ? ? int lens = -1; ? ? ? ? ? ? while ((lens = stream.read(b)) > 0) { ? ? ? ? ? ? ? ? stringBuilder.append(new String(b, 0, lens)); ? ? ? ? ? ? } ? ? ? ? ? ? return stringBuilder.toString(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? throw new RuntimeException(e); ? ? ? ? } ? ? } ? ? /** ? ? ?* 獲取請求體 ? ? ?* @return 請求體 ? ? ?*/ ? ? public String getBody() { ? ? ? ? MonitorPointQueryPara para = JSON.parseObject(tempBody, MonitorPointQueryPara.class); ? ? ? ? para.setName("1232321321"); ? ? ? ? tempBody = JSONObject.toJSONString(para); ? ? ? ? return tempBody; ? ? } ? ? /** ? ? ?* 需要重寫這個(gè)方法 ? ? ?* @return ? ? ?* @throws IOException ? ? ?*/ ? ? @Override ? ? public BufferedReader getReader() throws IOException { ? ? ? ? return new BufferedReader(new InputStreamReader(getInputStream())); ? ? } ? ? /** ? ? ?* 需要重寫這個(gè)方法 ? ? ?* @return ? ? ?* @throws IOException ? ? ?*/ ? ? @Override ? ? public ServletInputStream getInputStream() throws IOException { ? ? ? ? // 創(chuàng)建字節(jié)數(shù)組輸入流 ? ? ? ? final ByteArrayInputStream bais = new ByteArrayInputStream(tempBody.getBytes(Charset.defaultCharset())); ? ? ? ? return new ServletInputStream() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public boolean isFinished() { ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? } ? ? ? ? ? ? @Override ? ? ? ? ? ? public boolean isReady() { ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? } ? ? ? ? ? ? @Override ? ? ? ? ? ? public void setReadListener(ReadListener readListener) { ? ? ? ? ? ? } ? ? ? ? ? ? @Override ? ? ? ? ? ? public int read() throws IOException { ? ? ? ? ? ? ? ? return bais.read(); ? ? ? ? ? ? } ? ? ? ? }; ? ? } }
1.新建MyFilter 繼承 Filter
2.添加@WebFilter注解
3.啟動(dòng)類添加@ServletComponentScan(如下)
package com.orisdom.modules.common.filter; import org.springframework.core.annotation.Order; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** ?* @author xiaokang ?* @description ?* @date 2021/6/11 9:47 ?*/ @WebFilter public class MyFilter implements Filter { ? ? @Override ? ? public void init(FilterConfig filterConfig) throws ServletException { ? ? } ? ? @Override ? ? public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ? ? ? ? MyHttpServletRequestWrapper myHttpServletRequestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) servletRequest); // 相當(dāng)于賦值 ? ? ? ? myHttpServletRequestWrapper.getBody(); // 自己定義的MyHttpServletRequestWrapper ? ? ? ? filterChain.doFilter(myHttpServletRequestWrapper, servletResponse); ? ? ? ? System.out.println(11111111); ? ? } ? ? @Override ? ? public void destroy() { ? ? } }
沒加之前
加了之后
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用嵌套循環(huán)模擬ATM機(jī)取款業(yè)務(wù)操作示例
這篇文章主要介紹了Java使用嵌套循環(huán)模擬ATM機(jī)取款業(yè)務(wù)操作,結(jié)合實(shí)例形式分析了Java模擬ATM機(jī)取款業(yè)務(wù)操作的相關(guān)流程控制、數(shù)值判斷等操作技巧,需要的朋友可以參考下2019-11-11SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄
這篇文章主要介紹了springboot使用mybatis一對多的關(guān)聯(lián)查詢問題記錄,剛好最近有個(gè)需求需要做到關(guān)聯(lián)的查詢,時(shí)間也算充足,所以用sql來寫,于是踩了很久坑,終于跳出來了,小小記錄一下2022-01-01Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline 
本文主要介紹了Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline seat in use,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06springboot統(tǒng)一接口返回?cái)?shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了springboot統(tǒng)一接口返回?cái)?shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringBoot注冊web組件的實(shí)現(xiàn)方式
Servlet是Java Web應(yīng)用程序的基礎(chǔ),它提供了處理客戶端請求的機(jī)制,Servlet三大組件是指Servlet、Filter和Listener,它們是Java Web應(yīng)用程序的核心組件,本文將給大家介紹一下SpringBoot注冊web組件的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-10-10