欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)

 更新時(shí)間:2022年01月27日 15:06:05   作者:mazaiting  
本文主要介紹了SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1). 存在問題
流只能讀取一次

2). 目標(biāo)
多次讀取流

3). 解決方法
創(chuàng)建包裝類

4). RequestWrapper

package com.mazaiting.redeye.wrapper;
?
import com.mazaiting.redeye.utils.StreamUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
?
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 mazaiting
?* @date 2019-06-27
?* @decription HttpServletRequest 包裝器
?* 解決: request.getInputStream()只能讀取一次的問題
?* 目標(biāo): 流可重復(fù)讀
?*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
? ? /**
? ? ?* 日志
? ? ?*/
? ? private static final Logger mLogger = LoggerFactory.getLogger(RequestWrapper.class);
?
? ? /**
? ? ?* 請(qǐng)求體
? ? ?*/
? ? private String mBody;
?
? ? public RequestWrapper(HttpServletRequest request) {
? ? ? ? super(request);
? ? ? ? // 將body數(shù)據(jù)存儲(chǔ)起來
? ? ? ? mBody = getBody(request);
? ? }
?
? ? /**
? ? ?* 獲取請(qǐng)求體
? ? ?* @param request 請(qǐng)求
? ? ?* @return 請(qǐng)求體
? ? ?*/
? ? private String getBody(HttpServletRequest request) {
? ? ? ? try {
? ? ? ? ? ? return StreamUtil.getString(request.getInputStream());
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? mLogger.debug(e.getMessage());
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 獲取請(qǐng)求體
? ? ?* @return 請(qǐng)求體
? ? ?*/
? ? public String getBody() {
? ? ? ? return mBody;
? ? }
?
? ? @Override
? ? public BufferedReader getReader() throws IOException {
? ? ? ? return new BufferedReader(new InputStreamReader(getInputStream()));
? ? }
?
? ? @Override
? ? public ServletInputStream getInputStream() throws IOException {
? ? ? ? // 創(chuàng)建字節(jié)數(shù)組輸入流
? ? ? ? final ByteArrayInputStream bais = new ByteArrayInputStream(mBody.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();
? ? ? ? ? ? }
? ? ? ? };
? ? }
}

5).設(shè)置過濾器(必須)

@Component
@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")
@Order(10000)
public class HttpServletRequestFilter implements Filter {
? ? @Override
? ? public void init(FilterConfig filterConfig) throws ServletException {
?
? ? }
?
? ? @Override
? ? public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
? ? ? ? ServletRequest requestWrapper = null;
? ? ? ? if(servletRequest instanceof HttpServletRequest) {
? ? ? ? ? ? requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
? ? ? ? }
? ? ? ? //獲取請(qǐng)求中的流如何,將取出來的字符串,再次轉(zhuǎn)換成流,然后把它放入到新request對(duì)象中
? ? ? ? // 在chain.doFiler方法中傳遞新的request對(duì)象
? ? ? ? if(null == requestWrapper) {
? ? ? ? ? ? filterChain.doFilter(servletRequest, servletResponse);
? ? ? ? } else {
? ? ? ? ? ? filterChain.doFilter(requestWrapper, servletResponse);
? ? ? ? }
? ? }
?
? ? @Override
? ? public void destroy() {
?
? ? }
}

6). 使用

/***
?*
?* @author mazaiting
?* @date 2019-06-26
?* @decription Session 攔截器
?*/
public class SessionInterceptor implements HandlerInterceptor {
?
? ? /**
? ? ?* 日志
? ? ?*/
? ? private static final Logger mLogger = LoggerFactory.getLogger(SessionInterceptor.class);
?
? ? @Override
? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
? ? ? ? mLogger.debug("SessionInterceptor");
? ? ? ? // 獲取地址
? ? ? ? String url = request.getRequestURL().toString();
? ? ? ? mLogger.debug("url: " + url);
? ? ? ? // 獲取 session
? ? ? ? HttpSession session = request.getSession();
? ? ? ? String id = session.getId();
? ? ? ? mLogger.debug("sessionId: " + id);
? ? ? ? String requestMethod = request.getMethod();
? ? ? ? mLogger.debug("requestMethod: " + requestMethod);
? ? ? ? String servletPath = request.getServletPath();
? ? ? ? mLogger.debug("servletPath: " + servletPath);
?
? ? ? ? if (isJson(request)) {
? ? ? ? ? ? String body = new RequestWrapper(request).getBody();
? ? ? ? ? ? mLogger.debug("body: " + body);
? ? ? ? }
?
? ? ? ? return true;
? ? }
?
? ? /**
? ? ?* 判斷本次請(qǐng)求的數(shù)據(jù)類型是否為json
? ? ?*
? ? ?* @param request request
? ? ?* @return true: 是 JSON 數(shù)據(jù); false: 非 json 數(shù)據(jù)
? ? ?*/
? ? private boolean isJson(HttpServletRequest request) {
? ? ? ? if (request.getContentType() != null) {
? ? ? ? ? ? return request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE) ||
? ? ? ? ? ? ? ? ? ? request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE);
? ? ? ? }
?
? ? ? ? return false;
? ? }
}

到此這篇關(guān)于SpringBoot項(xiàng)目攔截器獲取Post方法的請(qǐng)求body實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot獲取Post方法的請(qǐng)求body內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA導(dǎo)出jar打包成exe應(yīng)用程序的小結(jié)

    IDEA導(dǎo)出jar打包成exe應(yīng)用程序的小結(jié)

    這篇文章主要介紹了IDEA導(dǎo)出jar打包成exe應(yīng)用程序,需要的朋友可以參考下
    2020-08-08
  • MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis緩存分為一級(jí)緩存和二級(jí)緩存一級(jí)緩存,本文給大家介紹mybatis緩存知識(shí),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼

    Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼

    這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java?超詳細(xì)講解SpringMVC攔截器

    Java?超詳細(xì)講解SpringMVC攔截器

    Spring?MVC?的攔截器(Interceptor)與?Java?Servlet?的過濾器(Filter)類似,它主要用于攔截用戶的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等功能上。本文將代碼演示和文字描述詳解攔截器的使用
    2022-04-04
  • 解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題

    解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題

    這篇文章主要介紹了解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java中EnvironmentAware 接口的作用

    Java中EnvironmentAware 接口的作用

    本文主要介紹了Java中EnvironmentAware 接口的作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 新手初學(xué)Java網(wǎng)絡(luò)編程

    新手初學(xué)Java網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。本文介紹了一些網(wǎng)絡(luò)編程基礎(chǔ)的概念,并用Java來實(shí)現(xiàn)TCP和UDP的Socket的編程,來讓讀者更好的了解其原理
    2021-07-07
  • 通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問

    通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問

    這篇文章主要介紹了通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat)

    SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat)

    這篇文章主要介紹了SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • java中的日期時(shí)間類Date和SimpleDateFormat

    java中的日期時(shí)間類Date和SimpleDateFormat

    這篇文章主要介紹了java中的日期時(shí)間類Date和SimpleDateFormat,Date類的對(duì)象在Java中代表的是當(dāng)前所在系統(tǒng)的此刻日期時(shí)間,說白了就是你計(jì)算機(jī)上現(xiàn)實(shí)的時(shí)間,需要的朋友可以參考下
    2023-09-09

最新評(píng)論