Https系列之三:让服务器同时支持http、https,基于spring boot
Https系列会在下面几篇文章中分别作介绍:
一:https的简单介绍及SSL证书的生成
二:https的SSL证书在服务器端的部署,基于tomcat,spring boot
三:让服务器同时支持http、https,基于spring boot
四:https的SSL证书在Android端基于okhttp,Retrofit的使用
所有文章会优先在:
微信公众号“颜家大少”中发布
转载请标明出处
前面已介绍了:”https在服务器端的部署,基于tomcat,spring boot“
但我们会发现一个问题,只能用https登录我们的网站,而不能用http
假设我们的网站名为:www.my.com
如果是之前的http,我们只需在浏览器中输入:my.com
浏览器就会自动登录到:http:// www.my.com
但部署了https后,发现在浏览器中输入:my.com,返回的结果是:无法访问此网站
这对用户来说,体验是非常不好的。
好吧,那我们试试一些比较有名的网站,如阿里云。
在浏览器中输入:aliyun.com
就能自动跳转到:https: //www.aliyun.com
那我们能不能在部署了https后,在输入:my.com
自动跳转到https对应的: https:// www.my.com
或
依然跳转到:http:// www.my.com ?
答案是,上面两种方法都可以的,任君选择
下面介绍的就是以上要求基于spring boot的实现
直接上代码:
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.Autowired;
import org.springframework.boot.CommandLineRunner;
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;
@SpringBootApplication
public class ServerMain implements CommandLineRunner{
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
//Due to CONFIDENTIAL and /*, this will cause Tomcat to redirect every request to HTTPS.
//You can configure multiple patterns and multiple constraints if you need more control over what is and is not redirected.
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//Set the scheme that will be assigned to requests received through this connector
//@param scheme The new scheme
connector.setScheme("http");
//Set the port number on which we listen for requests.
// @param port The new port number
connector.setPort(80);
//Set the secure connection flag that will be assigned to requests received through this connector.
//@param secure The new secure connection flag
//if connector.setSecure(true),the http use the http and https use the https;else if connector.setSecure(false),the http redirect to https;
connector.setSecure(false);
//redirectPort The redirect port number (non-SSL to SSL)
connector.setRedirectPort(443);
return connector;
}
public static void main(String[] args) throws Exception {
SpringApplication.run(ServerMain.class, args);
}
@Override
public void run(String... arg0) throws Exception {
// TODO Auto-generated method stub
}
}
其中,下面代码的作用是把此EmbeddedServletContainerFactory 注入到web容器中
@Bean
public EmbeddedServletContainerFactory servletContainer()
然后,用下面的代码拦截所有的/*请求
@Override
protected void postProcessContext(Context context) {
..........
constraint.setUserConstraint("CONFIDENTIAL");
collection.addPattern("/*");
.............
}
并把其关联到下面的httpConnector中
@Bean
public Connector httpConnector()
最后,在public Connector httpConnector()中,
把http设为默认的80端口,并把http的请求跳转到443的https端口
其中443是https的默认端口,也可以设为其它的值,但要和resources/application.properties的内容对应
如下:
server.port=443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias:tomcat
运行服务器,会看到打印如下:
其中会看到TomcatEmbeddedServletContainer,和同时开启的两个端口:443 (https) 80 (http)
TomcatEmbeddedServletContainer : Tomcat started on port(s): 443 (https) 80 (http)
Ok,那现在试试输入:my.com,就会发现浏览器会直接跳到:https:// www.my.com了
到此,这件事情就算是大功告成了。
但此时有同学可能会提出特殊的要求:
他的https只是为了某某的要求而使用的,比如说要接入什么什么的一定要填的是https的地址
而他的网站根本就不需要https这种安全级别的,另外,他觉得http的访问速度可能会快点,你知到有些同学是有这种洁癖的 :p
也就是说:
输入:my.com,跳到: http:// www.my.com
输入:https:// www.my.com,跳到:https:// www.my.com
要实现此要求,其实很简单,只需要把:
@Bean
public Connector httpConnector() {
........
connector.setSecure(false);
...........
改为
@Bean
public Connector httpConnector() {
........
connector.setSecure(true);
...........
就大功告成了
更多内容请看:Https系列之四:https的SSL证书在Android端基于okhttp,Retrofit的使用
更多内容,请关注微信公众号:颜家大少
Https系列之三:让服务器同时支持http、https,基于spring boot的更多相关文章
- Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】
1. Server side With spring boot, we can set up a http server easily. Restcontroller make it easier t ...
- (19)Spring Boot 添加JSP支持【从零开始学Spring Boot】
[来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论: 您的认可是我最大的动力,感谢您的支持] 看完本文章您可能会有些疑问,可以查看之后的一篇博客: 81. Spring Boot集成JSP疑问[从 ...
- Spring Boot配置篇(基于Spring Boot 2.0系列)
1:概述 SpringBoot支持外部化配置,配置文件格式如下所示: properties files yaml files environment variables command-line ar ...
- 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1) ...
- Spring Boot入门篇(基于Spring Boot 2.0系列)
1:概述: Spring Boot是用来简化Spring应用的初始化开发过程. 2:特性: 创建独立的应用(jar|war形式); 需要用到spring-boot-maven-plugin插件 直接嵌 ...
- Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot
Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...
- Https系列之一:https的简单介绍及SSL证书的生成
Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...
- Https系列之四:https的SSL证书在Android端基于okhttp,Retrofit的使用
Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...
- Spring Boot 支持 Https 有那么难吗?
https 现在已经越来越普及了,特别是做一些小程序或者公众号开发的时候,https 基本上都是刚需了. 不过一个 https 证书还是挺费钱的,个人开发者可以在各个云服务提供商那里申请一个免费的证书 ...
随机推荐
- c# 后台get post请求
//get请求 public static TResult Get<TResult>(string host, string url) { var httpClient = new Htt ...
- Android SQLite 简易指北
Android SQLite SQLite一款开源的, 轻量级的数据库. 以文本文件的形式存储数据. SQLite支持所有标准的关系型数据库特性. SQLite运行时占用内存非常少(约250 KByt ...
- STL中的二分查找———lower_bound,upper_bound,binary_search
关于STL中的排序和检索,排序一般用sort函数即可,今天来整理一下检索中常用的函数——lower_bound , upper_bound 和 binary_search . STL中关于二分查找的函 ...
- python进阶学习(二)
本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...
- org.apache.commons.lang.StringUtils 中 Join 函数
转自 http://my.oschina.net/zenglingfan/blog/134872 写代码的时候,经常会碰到需要把一个List中的每个元素,按逗号分隔转成字符串的需求,以前是自己写一段比 ...
- 在Hudson Job中启动daemon进程
场景 在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了. 环境 CentOS 6,Hudson 3.0 ...
- JQuery的动态加载class无法实现点击时间的解决方案
//对于 加载过来class 的del_a 实现点击事情 $(document).on('click',".del_a",function(){ $(".mark_id& ...
- None是什么?
None是什么,是空,就是空即是色,色即是空.是一个真的很特别的值,下面比较了下 0,True,False (python 的比較) >>> None == 0False>&g ...
- 自制STP配置实验
本图使用Gns模拟器 实验需求: 1.要求利用vtp实现vlan同步设置 2.要求vtp server实现备份冗余 3.创建vlan 1~10要求MLSW1 是奇数vlan主根 MLSW2 是偶数vl ...
- 【ctrl+A】与【ctrl+单击图层缩略图】有什么区别?
如果这图层没有透明区域的话那和ctrl+A的效果是一样的! 但如果图层有不透明区域,那选中的就是图层中所有不透明的区域!