首页 > 解决方案 > 如何在 Spring MVC 中以编程方式将请求从控制器转发到另一个控制器

问题描述

如今,我一直在制作 API 系统,但遇到了转发请求的问题。

在我的 API 系统中,来自用户的所有请求都首先到达代理控制器,然后将请求转发到真正的 API 版本化。

// proxy controller
@Controller
@RequestMapping("/proxy")
public class ProxyController {
  private static final String VERSION = "v1";

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public String getUsers() {
     return String.format("forward:/%s/users", VERSION);
  }
}


// Real API controller
@RestController("v1UsersController")
@RequestMapping("/v1/users")
public class UsersController {

  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public ApiResultsResponse<Users> findUsers(@RequestParam userId, ...) { 
    // ...
    // ...
    // ...
    // return users found
  } 

我找到了代理控制器,因为当某些情况发生时,例如升级 api 版本,我可以轻松更改真正的 api。

但是,因为我使用了 String 转发(在这种情况下为return String.format("forward:/%s/users", VERSION)),所以我不确定转发的真实 api 当前是否存在。

所以我想通过直接调用真正的api的控制器方法来确定这一点。如果是这样,当被调用的方法不存在时,我可以通过编译错误注意到这一点。问题是,我必须将真实 api 处理程序的参数条件与代理同步。(这有点脏。)

是否可以使用相同的 HttpServletRequest 对象直接调用转发控制器方法?

标签: springspring-mvcproxycontrollerforwarding

解决方案


您可以在调用控制器之前使用 spring HandlerInterceptorAdapter 进行拦截


推荐阅读