Springboot配置http自动跳转到https

谷歌将在今年10月份会对谷歌最新浏览器对有 input 的网页非 https 的请求进行拦截。目前国内的一些主要网站都已支持 https 了。但是有些网友问到我关于 Springboot?项目如何针对?http 请求自动跳转到 https?的请求呢?本文将带你揭开 Springboot 的配置面纱。

更多精彩内容请看 web前端中文站
www.lisa33xiaoq.net 可按Ctrl + D 进行收藏

例如,当在浏览器输入 https://www.lisa33xiaoq.net 后,会自动的跳转到 https://www.lisa33xiaoq.net

那么这是如何做到的呢?很简单,通过 Springboot 的 CommandLineRunner 就可实现。

下面看 Springboot 的实现代码:

 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 {         
 //www.lisa33xiaoq.net    
 }}

其中,下面代码的作用是把此 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 的默认端口,也可以设为其它的值,但不推荐这么做。

开启443端口,要在 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

运行服务器,会看到打印如下:

Springboot配置http自动跳转到https

其中会看到TomcatEmbeddedServletContainer,和同时开启的两个端口:443 (https) 80 (http)。

启动完项目后,再使用 http 访问域名后,会直接跳转到 https。

但是有的人又问了,我想同时支持 http 和 https 是呢?毕竟 http 是比 https?要快的。

做法其实很简单,将上述代码中的 connector.setSecure(false); 改为 connector.setSecure(true); 即可。

【注:本文源自网络文章资源,由站长整理发布】

0
如无特殊说明,文章均为原作者原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到