有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring引导:从HTTP重定向到HTTPS会导致PUT方法出现405错误

我有一个非常类似的问题:Redirect Post method HTTP -> HTTPS - HTTP Status 405 (Spring boot)

基本上,我试图通过从HTTP重定向到HTTPS,使Spring Boot同时服务于HTTP和HTTPS。它可以工作,但只适用于GET请求。如果我执行PUT请求,就会出现“request method'get'not supported”错误,所以看起来我的PUT请求正在以某种方式转换为get请求

我尝试了两种配置这种重定向的方法:在application.properties中定义HTTPS连接,然后以编程方式添加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 "Request method 'GET' not supported" while redirecting POST request to https port through Catalina Connector

但我不知道什么是“默认协议”常数。我尝试在那里添加所有方法(POST、PUT、DELETE、GET等),但都没有帮助


共 (1) 个答案

  1. # 1 楼答案

    重定向是专门通知客户端(例如web浏览器)使用给定的URL执行GET请求,因此重定向的结果不能是PUTPOSTDELETE或任何其他HTTP方法

    在这种情况下,重定向到HTTPS的主要目的是保护连接不受窥探,即确保任何人都看不到机密信息。这对GET很有效,因为您还没有发送机密信息,假设它是包含机密信息的响应

    PUTPOST重定向到HTTPS是毫无意义的,因为您已经通过不安全的连接发送了有效负载(机密数据)

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

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

    实际上,重定向PUT失败是件好事,因为它迫使您正确保护web应用程序。如果它没有失败,你会错误地认为你的web应用程序是由重定向保护的,而事实上它不是

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