我有一个与此问题非常相似的问题:重定向发布方法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等),但没有帮助。
一个重定向是专门通知客户端(例如web浏览器)做一个GET
使用一个给定的URL请求,所以一个重定向的结果不可能是PUT
,POST
,DELETE
,或任何其他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] 删除。
我来说两句