springboot实现https访问

略过springboot项目的创建步骤

打开命令符窗口,输入如下命令

C:/Users/Administrator>keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

根据提示输入

springboot实现https访问

完成后在C:UsersAdministrator目录下就会有一个keystore.p12文件

配置application.properties

server.port=443
# 证书路径
server.ssl.key-store=classpath:keystore.p12
# 证书秘钥
server.ssl.key-store-password=javajava
# 证书类型
server.ssl.key-store-type=PKCS12
# 证书别名
server.ssl.key-alias=tomcat

keystore.p12是放在resources目录下

springboot实现https访问

当在application.properties中的证书路径是这样时

server.ssl.key-store=keystore.p12

keystore.p12是放在项目根目录下,注意多模块项目,这是非多模块项目的目录结构,这时keystore.p12就是放在了项目根目录

springboot实现https访问

但是打成功jar包运行的时候报错

springboot实现https访问

将jar包解压出来发现里面根本没有keystore.p12文件,说明没有被打包进来,解决办法是将keystore.p12文件放在resources目录下,在application.properties中路径前加上classpath

server.ssl.key-store=classpath:keystore.p12

或者也可以将keystore.p12放在jar包的同级目录下

springboot实现https访问

可见springboot里的classpath指的就是classes目录,rosources目录就是直接映射到classes目录

springboot实现https访问

自动重定向httphttps

在启动类添加如下代码

@Bean
    public TomcatServletWebServerFactory servletContainer() {

        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(initiateHttpConnector());
        return tomcat;
    }

    /**
     * 让我们的应用支持HTTP是个好想法,但是需要重定向到HTTPS,
     * 但是不能同时在application.properties中同时配置两个connector,
     * 所以要以编程的方式配置HTTP connector,然后重定向到HTTPS connector
     * @return Connector
     */
    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80); // http端口
        connector.setSecure(false);
        connector.setRedirectPort(443); // application.properties中配置的https端口
        return connector;
    }

springboot实现https访问

controller测试的代码如下

@RestController
public class TestController {
    @GetMapping(value = "/")
    public String hello() {
        return "你好";
    }
}

浏览器验证

在浏览器地址栏输入localhost,回车即可看到

springboot实现https访问

在地址栏输入localhost相当于 http://localhost :80,回车切换成 https://localhost :443,因为80和443端口分别是http和https的默认端口,所以都隐藏了,如何同时支持http和https而端口不会变的,目前还在探索中。。

代码

springboot实现https访问

原文 

https://segmentfault.com/a/1190000020977714

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » springboot实现https访问

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址