如何强制RequestMapping重定向以遵守调用URL的协议。 (HTTPS / HTTP)

时间:2019-06-20 16:45:16

标签: spring spring-mvc java-8 apache-camel swagger

场景:

我对swagger-ui页面进行了重定向,以使其更易于访问。 (骆驼让我难过)
在本地运行时,我正在使用HTTP。
在测试服务器中运行时,我正在使用HTTPS。
另外,我最好配置骆驼流(xml)来更改swagger页面的默认URL。

预期-(https重定向到https)和(http重定向到http):

http://localhost:8080/swagger-ui-> http://localhost:8080/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl= https://remote.com/swagger-ui-> https://remote.com/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl=

实际-https和http重定向到http:

http://localhost:8080/swagger-ui-> http://localhost:8080/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl= https://remote.com/swagger-ui-> http://remote.com/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl=

代码:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SwaggerController {

    @RequestMapping("/swagger-ui")
    public String redirectToUi() {
        return "redirect:/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl=";
    }

    @RequestMapping("/swagger-ui.html")
    public String redirectToUi2() {
        return "redirect:/webjars/swagger-ui/index.html?url=/api/swagger&validatorUrl=";
    }
}
        <restConfiguration
                component="servlet"
                apiContextPath="swagger"
                contextPath="api"
                enableCORS="true"
                bindingMode="json">
            <dataFormatProperty key="prettyPrint" value="true"/>

            <!-- setup swagger api description -->
            <apiProperty key="base.path" value="api"/>
            <apiProperty key="api.version" value=".0.0.1"/>
            <apiProperty key="api.title" value="Some Forms"/>
            <apiProperty key="api.description" value="Description Here"/>
            <apiProperty key="api.contact.name" value="Contact here"/>
        </restConfiguration>

1 个答案:

答案 0 :(得分:0)

这是因为逻辑视图名称(例如“ redirect:/ myapp / some / resource”)会将您的调用重定向到当前Servlet上下文,在这种情况下,您的上下文方案是HTTP。

在这种情况下,您需要实现不同的上下文(一个用于HTTP,一个用于HTTPS),然后可以使用camel-servlet代理该调用

上下文1-http:

from("servlet:myapp?matchOnUriPrefix=true")
.to("http://newURL?bridgeEndpoint=true&throwExceptionOnFailure=false")

上下文2-https:

from("servlet:myapp?matchOnUriPrefix=true")
.to("https://newURL?bridgeEndpoint=true&throwExceptionOnFailure=false")