springboot的api如何配置多个统一前缀

springboot的api如何配置多个统一前缀,比如,`GET /{prefix1}/user`和`GET /{prefix2/user`访问的是同一个接口,如何实现?上网查了一下,springboot可以通过`server.servlet.context-path`统一配置api的前缀,但是只能配置一个,如何实现配置一个或者多个?
另外,以下两种方式也也可以实现,但是不是全局的,要一个接口一个接口去写:
* 方法上加`@GetMapping(value = {"/{prefix1}/user", "/{prefix2}/user"}`;
* 类上加`@RequestMapping(value = {"/{prefix1}/user", "/{prefix2}/user"}`
不知道有没有更好的方式呢?
阅读 15.8k
4 个回答

在类上配置多个前缀是最好的办法:

@RestController
@RequestMapping(value = {"/prefix1","/prefix2"})
public class HelloWorldController {
    @GetMapping("/hello")
    public String Hello(){
        return "hello,world!";
 }
}

要不写一个拦截器,把请求路径是prefix2的,替换成prefix1,然后再去请求

可以通过过滤器拦截请求,并修改请求后转发的思路去全局实现
过滤器的doFilter 方法如下:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String path = httpRequest.getRequestURI();
    //前缀数组
    String[] prefixArr = new String[]{"/prefix1", "/prefix2"};
    for (String prefix : prefixArr) {
        //以前缀开头的请求
        if (path.startsWith(prefix)) {
            //替换掉前缀
            path = path.replace(prefix, "");
            //转发
            httpRequest.getRequestDispatcher(path).forward(request, response);
            return;
        }
    }
    httpRequest.getRequestDispatcher(path).forward(request, response);
    return;
}

TestController

@RestController
public class TestController {
    @RequestMapping("/user")
    public String get(){
        return "123";
    }
}

以下三种地址都可以访问同一个Controller

  1. /{prefix1}/user
  2. /{prefix2}/user
  3. /user

可以在 WebMvc 自定义配置类中覆盖 public void configurePathMatch(PathMatchConfigurer configurer) 方法实现

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(Controller.class));
    }

}

此时访问所有 @Controller 注解的 Controller 类均需添加 /api 前缀,且不会影响到静态资源的访问(如果做了相关的设置的话)

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