如何在 spring boot 到达控制器之前修改请求体

新手上路,请多包涵

我有一个弹簧启动应用程序。我更改每个发布请求的请求正文。是否可以在请求到达控制器之前修改请求主体。请包括一个例子。

原文由 BlueCloud 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 820
2 个回答

简答

是的,但并不容易。

细节

我知道三个选项可以在请求到达控制器中的处理程序方法之前更改请求的主体;

  1. 在调用方法之前使用 AOP 更改请求。
  2. 创建 HTTP 过滤器。
  3. 创建自定义 Spring HandlerInterceptor。

由于您已经在使用 spring-boot,选项 3,自定义 Spring HandlerInterceptor,似乎是您的最佳选择。

这是一个指向 Baeldung 文章的链接,该文章 涵盖了 spring HandlerInterceptors。

Baeldung 文章不是您问题的完整答案,因为您只能阅读 InputStrem 返回的 HttpServletRequest 一次。

您将需要创建一个扩展类 HttpServletRequest 并将包装类中的每个请求包装在您的自定义 HandlerInterceptor 或自定义过滤器中(过滤器可能是前往此处的方式)。

包装类

  1. 阅读包装类构造函数中的 HttpServletRequest InputStream
  2. 根据您的要求修改正文。
  3. 将修改后的主体写入 ByteArrayOutputStream
  4. 使用 toByteArray byte[]
  5. 关闭 ByteArrayOutputStream(try-with-resources 对此很有用)。
  6. 覆盖 getInputStream 方法。
  7. 每次调用 getInputStream 时,将 byte[] 包装在 ByteArrayInputStream 中。返回此流。

如何包装请求

  1. 在您的 Filter 中,实例化您的包装类并传入原始请求(这是 doFilter 方法的参数)。
  2. 将包装器传递给 chain.doFilter 方法(不是原始请求)。

原文由 DwB 发布,翻译遵循 CC BY-SA 4.0 许可协议

另一种选择是向 HttpServletRequest 对象添加一个属性。之后,您可以使用 @RequestAttribute 注释在 Controller 类中读取该属性。

在拦截器中

@Component
    public class SimpleInterceptor extends HandlerInterceptorAdapter {

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws ServletException, IOException {
            String parameter = request.getParameter("parameter");
            if (parameter == "somevalue") {
                request.setAttribute("customAttribute", "value");
            }

            return true;
        }

    }

在控制器中

@RestController
@RequestMapping("")
public class SampleController {

    @RequestMapping(value = "/sample",method = RequestMethod.POST)
    public String work(@RequestBody SampleRequest sampleRequest, @RequestAttribute("customAttribute") String customAttribute) {
        System.out.println(customAttribute);
        return "This works";
    }
}

这具有不修改请求正文的优点。

原文由 Abhinay Dronavally 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题