zoukankan      html  css  js  c++  java
  • springboot+https+http

    http访问不安全,使用https相对好些。

    参考网址:https://blog.csdn.net/bock1984/article/details/90116965

    操作如下:

    • 1. 使用JDK自带keytool工具,创建本地SSL证书

     启动命令行工具,进入jdk的bin目录执行以下命令:
           

    keytool -genkey -v -alias tomcat -keyalg RSA -keystore F:	omcat.keystore -validity 36500

    1
    .-keyalg 生证书的算法名称,RSA是一种非对称加密算法 2.-keystore 生成的证书文件的存储路径 3.-validity 证书的有效期

    在这里插入图片描述

    • 2.将生成的tomcat.keystore文件拷贝到springboot项目根目录下:

    在这里插入图片描述

    • 3.修改application.properties文件

    ·

     看application.properties配置文件可知,后面只能用https协议访问了。

    1) http访问自动转https

    (用户前期用http协议,突然改成只用https访问,这样有的客户还用http访问时就访问不到服务器了,针对这种情况可做http访问自动转到https)

    光有HTTPS肯定还不够,很多用户可能并不知道,用户有可能继续使用HTTP来访问你的网站,这个时候我们需要添加HTTP自动转向HTTPS的功能,当用户使用HTTP来进行访问的时候自动转为HTTPS的方式。
    (这个是springboot2.x的配置,sprintboot1.x有些不一样 区别就是1.0用 EmbeddedServletContainerFactory ,,,2.0用 TomcatServletWebServerFactory
    (另也可以不用新建这个配置类,而是在入口类中添加下面这两个Bean就行了)
    package com.nsoft.gkzp.syscore.config;
    
    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.beans.factory.annotation.Value;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    /**
     * 监听http端口,如访问网址为http协议的,自动转换为Https
     */
    @Configuration
    @PropertySource(value="classpath:application.properties")
    public class HttpsComponent {
    
        //读取application.properties配置文件配置的https访问端口号
        @Value("${server.port}")
        public  int SYSTEM_HTTPS_PORT;
        //读取application.properties配置文件配置的http监控端口(自动转换为https)
        @Value("${server.http.port}")
        public  int SYSTEM_HTTP_PORT;
    
        @Bean
        public Connector connector(){
    
            Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(SYSTEM_HTTP_PORT);//Connector监听的http的端口号
            connector.setSecure(false);
            connector.setRedirectPort(SYSTEM_HTTPS_PORT);//监听到http的端口号后转向到的https的端口号(一般会用443端口)
            return connector;
        }
    
        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
    
            TomcatServletWebServerFactory tomcat =new TomcatServletWebServerFactory(){
                @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(connector());
            return tomcat;
        }
    }
    package com.nsoft.gkzp.syscore.config;
    
    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.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 监听http端口,如访问网址为http协议的,自动转换为Https
     */
    @Configuration
    public class HttpsComponent {
    
        @Bean
        public Connector connector(){
    
            Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8082);//Connector监听的http的端口号
            connector.setSecure(false);
            connector.setRedirectPort(8443);//监听到http的端口号后转向到的https的端口号(一般会用443端口)
            return connector;
        }
    
        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
    
            TomcatServletWebServerFactory tomcat =new TomcatServletWebServerFactory(){
                @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(connector());
            return tomcat;
        }
    }
    直接写端口号,理解更直观些

    另:

    这边自己生成的证书,是不被公网认证的。如下图。要想公网认证,需要去网上相关机构的去买(将域名提供给他们,他们生成公网可认证的证书),便宜点的大约一年一千多块钱吧。

    2) 同时支持http和https访问

    (参考 : https://blog.csdn.net/qq_38288606/article/details/89478353

     注意:Spring Boot不支持通过application.properties同时配置HTTP连接器和HTTPS连接器

    故我在application.properties配置了https相关配置,然后添加了一个自定义的server.http.port参数,然后新建httpComponent.java配置java类,来启动http端口访问

    application.properties

     新建类D:workspace-gzy-gkzpsrcmainjavacom softgkzpsyscoreconfighttpComponent.java

    package com.nsoft.gkzp.syscore.config;
    
    import org.apache.catalina.connector.Connector;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    
    
    /**
     * 监听http端口,使http访问端口生效
     */
    @Configuration
    @PropertySource(value="classpath:application.properties")
    public class httpComponent {
    
        //读取application.properties配置文件配置的http监控端口
        @Value("${server.http.port}")
        public  int SYSTEM_HTTP_PORT;
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
            tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
            return tomcat;
        }
    
        private Connector createStandardConnector() {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setPort(SYSTEM_HTTP_PORT);
            return connector;
        }
    
    }

    至此,就可以用  https://localhost   和 http://localhost:8082 访问了。这是spring2.x的配法。

     

    注意: 上面在application.properties配置文件中配置访问端口号,是因为工程用了内置的tomcat容器(如下图pom.xml引入的tomcat依赖)。如果是用外部的tomcat,则直接在tomcat的confserver.xml配置文件里配置相关参数。


    参考文章:
  • 相关阅读:
    高级软件工程--第八次作业
    高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
    Bate测试报告
    版本发布说明
    Beta版本展示博客
    Beta阶段总结分析报告
    Bate敏捷冲刺每日报告--day5
    Bate敏捷冲刺每日报告--day4
    Bate敏捷冲刺每日报告--day3
    Kettle中通过触发器方式实现数据 增量更新
  • 原文地址:https://www.cnblogs.com/zdyang/p/11775839.html
Copyright © 2011-2022 走看看