Spring Boot:从HTTP重定向到HTTPS导致PUT方法出现405错误

Dmytro Titov:

我有一个与此问题非常相似的问题:重定向发布方法HTTP-> HTTPS-HTTP状态405(春季启动)

基本上,我试图通过从HTTP到HTTPS的重定向来使Spring Boot同时服务于HTTP和HTTPS。它有效,但仅适用于GET请求。如果执行PUT请求,则会出现“不支持请求方法'GET'的错误”错误,因此看起来我的PUT请求以某种方式被转换为GET请求。

我尝试了两种配置重定向的方法:在其中定义HTTPS连接application.properties,然后以编程方式添加HTTP,反之亦然。都没有工作。

这是第一种方法:

@Bean
public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    addHTTPConnector(factory);
    return factory;
}

private void addHTTPConnector(TomcatEmbeddedServletContainerFactory factory) {
    Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8080);
    connector.setRedirectPort(8443);
    connector.setSecure(false);
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    protocol.setSSLEnabled(false);
    factory.addAdditionalTomcatConnectors(connector);
}

application.properties

server.port=8443
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=alias

这是第二种方法:

@Bean
public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    addHTTPSConnector(factory);
    factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setRedirectPort(8443));
    return factory;
}

private void addHTTPSConnector(TomcatEmbeddedServletContainerFactory factory) {
    Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("https");
    connector.setPort(8443);
    connector.setSecure(true);
    Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
    protocol.setSSLEnabled(true);
    protocol.setKeystoreFile("keystore.p12");
    protocol.setKeystorePass("password");
    protocol.setKeystoreType("pkcs12");
    protocol.setKeystoreProvider("SunJSSE");
    protocol.setKeyAlias("alias");
    factory.addAdditionalTomcatConnectors(connector);
}

对于我俩

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requiresChannel().anyRequest().requiresSecure();
    }

}

为了使重定向工作。

我也看到了这个答案:Spring Boot“不支持请求方法'GET'”,同时通过Catalina Connector将POST请求重定向到https端口

但是我不知道什么是“ DEFAULT_PROTOCOL”常量。我尝试在其中添加所有方法(POST,PUT,DELETE,GET等),但没有帮助。

安德烈亚斯(Andreas):

一个重定向是专门通知客户端(例如web浏览器)做一个GET使用一个给定的URL请求,所以一个重定向的结果不可能是PUTPOSTDELETE,或任何其他HTTP方法。

在这种情况下,重定向到HTTPS的主要目的是保护连接免受监听,即确保没有人可以看到机密信息。这对于来说效果很好GET,因为您尚未发送机密信息1,前提是该响应包含机密信息。

将a PUT或a 重定向POST到HTTPS是没有意义的,因为您已经通过不安全的连接发送了有效负载(机密数据)。

您的客户端需要发送数据之前被告知要使用HTTPS ,即,在构建PUT/ POST请求时,需要为其提供HTTPS URL。

修复客户端代码,例如,生成HTTP的JavaScript代码PUT,因此它使用HTTPS。重定向为时已晚,并且完全错误。

重定向PUT失败实际上是一件好事,因为它迫使您正确保护Web应用程序。如果没有失败,那么您可能会误以为您的Web应用程序已受到重定向的保护,而实际上并非如此。

1)GET也可以包含机密信息,例如在查询字符串中。如果是这样,则绝不应该使用HTTP发送该消息,因此在这种情况下,保护PUT/的规则POST也适用GET

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Webflux:将http重定向到https

在Spring Boot应用程序中重定向到自定义错误页面时出错

Spring Boot将HTTP重定向到HTTPS

如何使用Spring Security Java配置将HTTP请求重定向到HTTPS?

Spring Boot OAuth2不重定向到Facebook

配置Spring Boot以重定向某些URL上的某些错误

Spring Boot Zuul请求的错误重定向

在Spring Boot 2.0.4中从http重定向到https

Spring Boot安全性不会重定向configure(HttpSecurity http)方法上的oauth / authorize调用

Spring Boot-重定向到其他控制器方法

Spring Boot和ELB-如何使负载均衡器将http重定向到https?

Spring Boot RestEndpoint重定向到角路由

Spring Boot部署到GAE时导致WebAppContext错误

Spring Boot和Spring Security始终重定向到Login

在Spring Boot Embedded Underwow上将http重定向到https

Spring Boot重定向过多

如何在Spring Cloud Gateway中将HTTP重定向到HTTPS

Spring Boot登录重定向302丢失HTTPS

需要Spring Boot重定向到F5 BigIP SSL代理后面的https,但要监听http

登录后将Spring Boot重定向到请求的URL

Spring Boot中GetMapping返回错误405

如何使用命令行启动的Spring Boot自动重定向到https

我获得HTTP Status 405的Spring MVC PUT方法,无法重定向到另一个内部视图

如何从 Spring Boot genericResponse 方法重定向到 HTML 静态页面

Spring 重定向发生在“http://...../login”而不是“https://...../login”

在 Spring Boot 显示中请求无效或未知 URL 时如何重定向到错误页面

使用 spring boot / thymyleaf 重定向到 HTML 页面

如何使用 Spring Boot 重定向到新域(url)?

spring boot MVC:如何重定向到视图