springboot-learn-03

30585 ワード

SpringbootにHTTPS機能を追加
HTTPS:ハイパーテキスト転送セキュリティプロトコル(HyperText Transfer Protocol Secure)、略称:HTTPS;HTTP over TLS、HTTP over SSLまたはHTTP Secureと呼ばれることが多い)は、コンピュータネットワークを介して安全な通信を行う伝送プロトコルである.HTTPSはHTTP経由で通信するが、SSL/TLSでパケットを暗号化する.HTTPS開発の主な目的は,ウェブサイトサーバに対するアイデンティティ認証を提供し,交換データのプライバシーと完全性を保護することである.このプロトコルは、ネットビュー(Netscape)が1994年に初めて提案し、インターネットに拡張された.
  • HTTPSデジタル証明書を生成Javaが持参したJDK管理ツールkeytoolを利用して無料のhttps証明書を生成する.%JAVVAへHOME%binディレクトリの下で、次のコマンドを実行してデジタル証明書を生成します:
  • keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:\Zhangjian_HTTPS_digital_certificate.p12 -validity 365
    
          :
    
    - genkey            。
    - alias    keystore    。
    - keyalg            RSA ,         。
    - keysize        。
    - keystore            。
    - validity          ,    。
    

    springboot-learn-03_第1张图片 springboot-learn-03_第2张图片
  • HTTPSを導入し、上記で生成したZhangjian_HTTPS_digital_certificate .p12をSpring Bootプロジェクトのresourcesディレクトリの下にコピーする.springboot-learn-03_第3张图片アプリケーションでpropertiesには、springboot-learn-03_第4张图片
  • の構成が追加されています.
    #   HTTPS    
    server.ssl.key-store=classpath:Zhangjian_HTTPS_digital_certificate.p12
    server.ssl.key-alias=tomcathttps
    server.ssl.key-store-password=zjroot
    

    プロジェクトを開始し、直接Httpプロトコルを使用してインタフェースにアクセスすると、springboot-learn-03_第5张图片在这里插入图片描述httpsに変更してアクセスすると、結果は以下の通りです:springboot-learn-03_第6张图片「安全ではありません」:これは私たちが生成したhttps証明書がブラウザに認められないためですが、大丈夫です.私たちは直接クリックしてアクセスを続けることができます(実際のプロジェクトではブラウザで承認されたhttps証明書を交換するだけでいいです).
  • 要求転送Spring BootはHTTPとHTTPSの同時起動をサポートしていないことを考慮し、この問題を解決するために、ここでは要求転送を構成することができ、ユーザーがHTTP呼び出しを開始すると、自動的にHTTPSに転送する.
  • 新規構成クラスTomcatConfigspringboot-learn-03_第7张图片
  • import org.apache.tomcat.util.descriptor.web.SecurityCollection;
    import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class TomcatConfig {
        @Bean
        TomcatServletWebServerFactory tomcatServletWebServerFactory() {
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint constraint = new SecurityConstraint();
                    constraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    constraint.addCollection(collection);
                    context.addConstraint(constraint);
                }
            };
            factory.addAdditionalTomcatConnectors(createTomcatConnector());
            return factory;
        }
        private Connector createTomcatConnector() {
            Connector connector = new
                    Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8081);
            connector.setSecure(false);
            connector.setRedirectPort(8080);
            return connector;
        }
    }
    

    ここでは、Httpの要求ポートを8081として構成し、8081からのすべての要求は、8080というhttpsのポートに自動的にリダイレクトされる.
    その後、httpリクエストにアクセスすると、自動的にhttpにリダイレクトされます.テスト:在这里插入图片描述
    在这里插入图片描述HTTPSへの移行に成功した.
    Springbootのスターを手動で生成
    私たちはSpring Bootを使っていますが、基本的にはStaterの便利さに酔っています.Starterは私たちに多くの自動化配置をもたらしてくれました.これらの自動化配置があれば、私たちは灰を吹くことなく生産レベルの開発環境を構築することができます.一部のパートナーはこのStarterが不思議だと思っています.実はスターもSpring+SpringMVCの基礎知識点で実現されています.実はStarterの核心は条件注記@Conditionalで、classpathの下にあるClassが存在すると、ある構成が有効になります.
  • カスタムStarterいわゆるStarterは、実は普通のMavenプロジェクトです.そのため、カスタムStarterは、まず普通のMavenプロジェクトを作成する必要があります.作成が完了したら、pom.xmlにStarterの自動化構成クラスを追加すればいいです.以下のようにします.
  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>2.1.4.RELEASE</version>
    </dependency>
    

    springboot-learn-03_第8张图片構成が完了すると、まずアプリケーションを受け入れるHelloPropertiesクラスを作成します.propertiesに注入された値は、次のとおりです.
    package com.zhangjian.springboot.springboot_learn_002;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Component
    @ConfigurationProperties(prefix = "zhangjian")
    public class HelloProperties {
        private static final String DEFAULT_NAME = "ZhangJian";
        private static final String DEFAULT_MSG = "hello~";
        private String name = DEFAULT_NAME;
        private String msg = DEFAULT_MSG;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
    

    springboot-learn-03_第9张图片エラーを報告し、Componentを加えて解決する.springboot-learn-03_第10张图片解決Configuration Annotation Proessor not found in classpathは以下の通りである.
  • spring boot Configuration Annotation Proessor not found in classpathの提示は@ConfigurationPropertiesという注釈を用いる場合であるため、問題は2.ConfigurationProperties注記.
  • プロンプトのnot found in classpathに基づいて、この注釈の使用を問い合わせるclasspathの指定方法について、さらにlocation,spring boot 1を問い合わせる.5以上のバージョン@ConfigurationPropertiesはlocation注記をキャンセルします.

  • 公式ソリューション、Maven導入依存:
    <dependency>
       <groupId> org.springframework.boot </groupId>
       <artifactId> spring-boot-configuration-processor </artifactId>
       <optional> true </optional>
    </dependency>
    

    springboot-learn-03_第11张图片HelloPropertiesクラスに戻ります.この構成クラスはよく理解しています.アプリケーションを使用します.propertiesで構成された属性値はこの例に直接注入され、@ConfigurationPropertiesタイプの安全な属性注入がアプリケーションされる.propertiesファイルの接頭辞zhangjianの属性がこのクラスに対応する属性に注入され、最後に使用する場合、アプリケーション.propertiesのプロファイルは、次のようになります.springboot-learn-03_第12张图片構成が完了したら、HelloPropertiesを定義し、簡単なsayメソッドを定義します.HelloServiceの定義は次のとおりです.
    package com.zhangjian.springboot.springboot_learn_002;
    
    public class HelloService {
        private String msg;
        private String name;
        public String sayHello() {
            return name + " say " + msg + " !";
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    

    springboot-learn-03_第13张图片次は私たちの重軸劇で、自動的にクラスの定義を配置して、多くの他の人が定義したカスタムクラスを使った後、私たちも自分でカスタムクラスHelloServiceAutoConfigurationを定義します:
    package com.zhangjian.springboot.springboot_learn_002;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableConfigurationProperties(HelloProperties.class)
    @ConditionalOnClass(HelloService.class)
    public class HelloServiceAutoConfiguration {
        @Autowired
        HelloProperties helloProperties;
    
        @Bean
        HelloService helloService() {
            HelloService helloService = new HelloService();
            helloService.setName(helloProperties.getName());
            helloService.setMsg(helloProperties.getMsg());
            return helloService;
        }
    }
    
    

    springboot-learn-03_第14张图片解釈は以下の通り.
  • まず@Configuration注記は、これが構成クラスであることを示しています.
  • @E n a b l e ConfigurationProperties注記は、私たちが以前に@ConfigurationPropertiesを有効にし、構成された属性をBeanに正常に入れることです.
  • @ConditionalOnClassは、プロジェクトの現在のclasspathの下にHelloServiceが存在する場合、後の構成が有効になることを示します.
  • 自動構成クラスには、まずHelloPropertiesが注入され、この例にはアプリケーションが含まれている.propertiesで構成されている関連データ.
  • HelloServiceのインスタンスを提供し、HelloPropertiesの値を入力します.