springboot Post 請求攔截Body參數

springboot Post 請求攔截Body參數

應用場景

  1. 想捕獲請求發過來的所有參數(包含也許 接收類 不包含的字段)
  2. 想查看 Feign 遠程接口 進行的序列化是否如願

    簡單問一句,你知道 Feign 接口參數類如果包含一個域 是 Class 類型的話,序列化的結果是啥嗎?還有如果 Feign 如果傳遞時間 Date 是否會有問題呢?

注意事項

  1. 記得body裏面的參數是儲存在 輸入流 裏的,如果你的攔截器讀取了輸入流,那麼這個輸入流就不會再有參數了,即到達 Controller的參數爲空的

代碼

攔截器

@Component
public class AuthSecurityInterceptor extends HandlerInterceptorAdapter {
    private Logger logger = LoggerFactory.getLogger(AuthSecurityInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        String body = getBody(httpServletRequest);
        System.out.println(body);
        return true;// true 則繼續執行
    }

    public String getBody(HttpServletRequest request) {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return stringBuilder.toString();
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }

配置類

@Configuration
public class WebSecurityConfig extends WebMvcConfigurerAdapter {
    
    @Bean
    public AuthSecurityInterceptor getSecurityInterceptor() {
        return new AuthSecurityInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());

        // 攔截配置
        addInterceptor.addPathPatterns("/**");
    }
}

參考

  1. spring boot攔截器中獲取request post請求中的參數

做個筆記,以免以後忘記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章