我们通过在application.properties中使用"/api"
在api中将基本路径配置为具有server.servlet-path=/api
,现在在http://host:port/api/swagger-ui.html
可以使用swagger文档
但是由于我们所有的服务文档都可以在http://host:8080/swagger-ui.html
获得,因此我们希望该服务也可以在同一路径上提供。
现在,我想拦截对http://host:8080/swagger-ui.html
的api调用,并将其重定向到http://host:8080/api/swagger-ui.html
。
@RestController
@RequestMapping(path = "/")
public class SwaggerRedirectController {
@GetMapping(value = "/swagger-ui.html")
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.sendRedirect("https://host/api/swagger-ui.html");
由于我们已经将基本路径设置为“ / api”,尽管请求将发送到/swagger-ui.html,但它会附加“ / api”作为基本路径,并且不会点击此自定义api。
我想拦截此请求并从中删除"/api"
,以便它将命中此自定义api,并最终将其重定向为/api/swagger-ui.html
这可能吗?或其他任何方式做到这一点
是,您可以使用Interceptor
将特定请求重定向到另一个路径>
这里是一个示例,显示了如何执行此操作:
@Component public class CustomInterceptor extends HandlerInterceptorAdapter { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public boolean preHandle(HttpServletRequest requestServlet, HttpServletResponse responseServlet, Object handler) throws Exception { if (requestServlet.getRequestURI().equals("/swagger-ui.html")){ responseServlet.sendRedirect("/api/swagger-ui.html"); logger.info("redirect request for url: {} to: /api/swagger-ui.html", requestServlet.getRequestURI()); return false; } return super.preHandle(requestServlet, responseServlet, handler); } }
编辑:
我忘记添加配置类来激活拦截器。我不好,对不起。这是激活此拦截器的配置类:
@Configuration
public class Config implements WebMvcConfigurer {
@Autowired
CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor);
}
}