SpringBoot使用教程【2】支援Https以及Http重定向Https

weixin_33670713發表於2018-01-11

生成證照

利用java生成證照命令:window cmd視窗進入java bin目錄

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650
1131704-e71fcceef9b441f2.png
image.png
1131704-32f69bd8a570a5bb.png
image.png

配置證照

Springboot專案配置證照,其它專案自行搜尋相應的配置方法
application.properties 配置 。keystore.p12放入專案根路徑。

server.port=8081
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
1131704-b4ff9673d31d918d.png
image.png

Http重定向Https

我們希望原來的http請求能自動重定向到最新的Https請求地址,從而避免客戶端更改相應的介面地址:
package com.didispace;

    import org.apache.catalina.Context;
    import org.apache.catalina.connector.Connector;
    import org.apache.tomcat.util.descriptor.web.SecurityCollection;
    import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    
    import org.springframework.context.annotation.Bean;
    
    import com.sun.org.apache.bcel.internal.classfile.Method;
    
    @SuppressWarnings("unused")
    @SpringBootApplication
    public class ChapterApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(ChapterApplication.class, args);
        }
    
        // protected SpringApplicationBuilder configure(SpringApplicationBuilder
        // application) {
        // return application.sources(ChapterApplication.class);
        // }
    
        @Bean
        public EmbeddedServletContainerFactory servletContainer() {
    
            TomcatEmbeddedServletContainerFactory tomcat = 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);
                }
            };
            tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    
            return tomcat;
        }
    
        private Connector initiateHttpConnector() {
            Connector connector = new Connector(
                    "org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8081);
            return connector;
        }
    
    }
1131704-0ebfebb07b411a21.png
image.png

發現問題

  • Http重定向Https的時候,埠號不能相同,否者啟動專案的時候會報 埠占用 的異常錯誤;


    1131704-98587b660026ebcb.png
    Http重定向Https POST請求失敗
  • Http重定向Https的時候,Get請求是沒有任何問題的。但是一旦重定向為POST請求的時候,就會報405請求方法不支援的錯誤。原因在於重定向的時候,Get請求沒有轉化為對應的POST請求。用如下方法可以解決這個問題(此方法是錯誤的):
    https://stackoverflow.com/questions/42108498/redirect-post-method-http-https-http-status-405-spring-boot
  SecurityCollection collection = new SecurityCollection();
  collection.addMethod("post");   //新增post方法
  collection.addPattern("/*");

驗證成功:


1131704-2ceca6042a01cce3.png
Http重定向Https之post請求

參考文獻

相關文章