springboot Post 请求拦截Body参数

本文介绍了在SpringBoot中如何拦截POST请求的Body参数,适用于需要捕获所有请求参数和检查序列化情况的场景。文章提醒注意,一旦拦截器读取输入流,后续将无法获取Body参数。提供了拦截器和配置类的实现代码作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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请求中的参数

做个笔记,以免以后忘记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值