【问题标题】:Intercept header & call service before every endpoint在每个端点之前拦截标头和调用服务
【发布时间】:2022-01-19 14:55:01
【问题描述】:

我有一个用例,其中对我的 SpringBoot 应用程序的每个 HTTP 请求都将在标头中包含一个 id。我需要调用内部服务来检索基于该 ID 存储在我的数据库中的信息;然后这些信息将在我的 RestControllers 调用的服务中使用。

我曾考虑过使用拦截器,但即使它们允许我调用我的服务并检索数据库中的信息,我也无法将该对象转发给我的业务服务。 我探索的另一条路径是通过 AOP。但是,虽然您可以在切面内部检索调用您的方法的信息,但我认为您不能在带注释的方法中访问切面检索到的数据。

有什么方法可以在不使用@RequestHeader 并在每个 RestController 的方法中手动调用我的服务的情况下正确执行此操作(从而复制大量代码)?

谢谢!

【问题讨论】:

    标签: java spring header aop interceptor


    【解决方案1】:

    但即使这些将允许我调用我的服务并检索 数据库中的信息,据我所知无法转发 反对我的业务服务

    您可以使用HttpServletRequest request,它具有http 请求范围,这意味着为客户端在服务器中发出的每个http 请求创建一个新对象。您可以通过每个拦截器使用其他信息来丰富它,以便在将其传递给最终控制器方法时将其作为属性包含。

    使用HandlerInterceptor的如下方法,会在spring业务方法被调用之前调用。

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    

    然后在这个方法中,你可以在请求对象中设置你想要的值作为属性。

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        ... call external api and fetch some value....
        ... Object myObj = apiCall...
        request.setAttribute("myObj", myObj);
        return true;
    }
    

    然后在你的 spring 控制器中你可以访问你之前设置的这个属性。

        @GetMapping(path = "/{mypath}")
        public void getRequest(HttpServletRequest request){
    
           Object myObj = request.getAttribute("myObj");
            if (myObj != null) {
              //you have myObj accessible here!
            }
       }
    

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多