春季启动中的拦截和重定向请求

问题描述 投票:0回答:1

我们通过在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

这可能吗?或其他任何方式做到这一点

spring spring-boot swagger spring-rest
1个回答
0
投票

是,您可以使用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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.