首页 > 解决方案 > spring boot HandlerInterceptor的HttpServletRequest.getParameter()返回null

问题描述

我正在覆盖 Spring Boot HandlerInterceptor 的 preHandle() 方法。当我在 HttpServletRequest 请求上调用 getParameter() 方法时,它返回 null。

@Component
@Slf4J
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
        log.info("age::{}",request.getParameter("age"));
    
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
}

控制器类...

@RestController
@Slf4J
public class Controller {

    @PostMapping("/test")
    public void test(@RequestBody Person person){
        log.info("in test method");
    }
}

来...

@Data
public class Person {
   private Integer age;
}

json 正文....

{"age":"34"}

输出:

age:: null

Body 存在于 HttpServletRequest 中。我已经使用 bufferReader 和 getContentLength() 对其进行了验证,但无法通过 getParameter() 访问它。

我已经浏览了下面的堆栈溢出链接

将 POST 的有效负载记录到 Tomcat

HttpServletRequest.getParameter() 返回 null

http://natch3z.blogspot.com/2009/01/read-request-body-in-filter.html

这些都有助于从请求正文中提取数据,但需要编写大量自定义代码。spring 是否提供了任何解决方案,我可以直接使用它来访问参数值。

为什么 getParameter() 返回 null,我们如何直接访问数据?

标签: javaspring-mvcservletshandlerinterceptor

解决方案


我已经以其他方式解决了这个问题。

我用过apache的IOUtils,org.apache.commons.io.IOUtils

String data = IOUtils.toString(request.getReader());
Person person = new ObjectMapper().readValue(data, Person.class);

这解决了我的问题,但我仍然觉得这是一种解决方法,因为 getParameter() 应该为我认为的键返回适当的值。


推荐阅读