springboot 开启https与http共存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 开启https与http共存相关的知识,希望对你有一定的参考价值。
参考技术A 首先,服务器要同时支持http和https,需要通过重定向实现。因为https是必须提供支持的,那为何还要提供http的服务呢?直接访问https不就行了,不是多此一举吗?因为大家是习惯于只输入简单域名访问的,这时到达的就是http,如果不提供http的支持,用户还以为你的网站已经挂了呢。两种协议都提供支持,所以是需要打开两个Socket端口的,一般http为8080,而https为8089。然后就需要把所有访问http的请求,重定向到https即可。不同的服务器有不同的实现,现在介Springboot的实现。
生成自签名证书,依靠jdk提供的keytool工具
接着会提示你输入密码,记住密码,别忘记了,这里以 123456 为例
在配置文件中添加ssl支持的配置
将我们生成的证书放在resource目录下
此时我们已经可以通过 8089 端口通过https访问了,但是今天的重点在于同时支持http和https,让http的请求重定向到https上
重启项目,通过 http://localhost:8080 访问项目,可以发现会自动跳转到https端口 https://localhost:8089 奥利给,又是充满希望的一天!
SpringBoot开启HTTPS
springboot 默认只开启 http请求,若是要开启https 需要生成证书和配置
1.首先打开CMD命令行工具,在JDK/bin目录下 生成证书.keystore
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore F:/tomcat.keystore -storepass 123456
相关参数:
keytool -genkey -alias tomcat(别名) -keypass 123456(别名密码) -keyalg RSA(生证书的算法名称,RSA是一种非对称加密算法) -keysize 1024(密钥长度,证书大小) -validity 365(证书有效期,天单位) -keystore F:/tomcat.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码) - storetype (指定密钥仓库类型)
springboot配置ssl(证书为.keystore文件)
1.将tomcat.keystore拷贝到项目根目录下(跟pom文件同级目录)
2.配置application.properties
#端口号 server.port=8443 #你生成的证书名字 server.ssl.key-store=tomcat.keystore #密钥库密码 server.ssl.key-store-password=123456 server.ssl.keyStoreType=JKS server.ssl.keyAlias:tomcat
3.修改springboot运行主类:实现http自动跳转https
package com.mingtong.demo_client; 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.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoClientApplication { public static void main(String[] args) { SpringApplication.run(DemoClientApplication.class, args); } @GetMapping("/login") public String login() { return "login"; } /** * it\'s for set http url auto change to https */ @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL");// confidential SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } @Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(8443); return connector; } }
测试:访问http://localhost:8080/login,会自动跳转到https://localhost:8443/login
以上是关于springboot 开启https与http共存的主要内容,如果未能解决你的问题,请参考以下文章