繁体   English   中英

Spring webflux:将http重定向到https

[英]Spring webflux: redirect http to https

如何在 spring webflux 中配置 http-> https 重定向? 我需要将所有http请求重定向到https (据我所知,任何http请求都应该具有301 http 状态响应并更改 http-> https)。 文档中没有找到任何关于它的信息 我找到了这个答案,但它与tomcat有关。 我有网。

我找到了方法,希望它可以帮助某人:

@Bean
public WebFilter httpsRedirectFilter() {
    return new WebFilter() {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
            URI originalUri = exchange.getRequest().getURI();

            //here set your condition to http->https redirect
            List<String> forwardedValues = exchange.getRequest().getHeaders().get("x-forwarded-proto");
            if (forwardedValues != null && forwardedValues.contains("http")) {
                try {
                    URI mutatedUri = new URI("https",
                            originalUri.getUserInfo(),
                            originalUri.getHost(),
                            originalUri.getPort(),
                            originalUri.getPath(),
                            originalUri.getQuery(),
                            originalUri.getFragment());
                    ServerHttpResponse response = exchange.getResponse();
                    response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
                    response.getHeaders().setLocation(mutatedUri);
                    return Mono.empty();
                } catch (URISyntaxException e) {
                    throw new IllegalStateException(e.getMessage(), e);
                }
            }
            return chain.filter(exchange);
        }
    };
}

我设法使它与以下工作。 但是,我怀疑这是否受支持,并且将来可能会导致问题。

@Configuration
public class HttpToHttpsRedirectConfig {

    @PostConstruct
    public void startRedirectServer() {
        NettyReactiveWebServerFactory httpNettyReactiveWebServerFactory = new NettyReactiveWebServerFactory(8080);
        httpNettyReactiveWebServerFactory.getWebServer((request, response) -> {
            URI uri = request.getURI();
            URI httpsUri;
            try {
                httpsUri = new URI("https", uri.getUserInfo(), uri.getHost(), 8443, uri.getPath(), uri.getQuery(), uri.getFragment());
            } catch (URISyntaxException e) {
                return Mono.error(e);
            }
            response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
            response.getHeaders().setLocation(httpsUri);
            return response.setComplete();
        }).start();
    }

}

有一个内置的redirectToHttps过滤器对我有用。 它可以按如下方式使用:

@Bean
public SecurityWebFilterChain securityWebFilterChain(final ServerHttpSecurity http) {
    http
        .authorizeExchange()
            .anyExchange()
                .authenticated()
                .and().oauth2Login()
        .redirectToHttps();

    return http.build();
}

文档可以在这里找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM