Springboot以Jetty为容器实现http重定向到https
1 简介
之前讲解的springboot
整合https
用的是tomcat
作为容器,tomcat
也是一个流行多年的老牌java容器了。但针对不同的场景,还是会有不同的选择,如jetty
。jetty
是架构相对简单、基于handler
的灵活可扩展的servlet
容器。更多详情请参考。
另外建议阅读其它相关文章:
(2)https之密钥知识与密钥工具keytool和keystore-explorer
(3)springboot以tomcat为容器实现http重定向到https的两种方式
2 重定向实现
为了代码结构清晰一点,把配置拆成两个类。
2.1 重定向
httptohttpsjettyconfig
是与jetty
强相关的配置类,继承于abstractconfiguration
,以便后续用于webserverfactory
的设置,如果没有这个类的配置,那就会同时具有http
和https
服务,无法重定向。这个类的配置要求连接必须是安全的。具体代码如下:
package com.pkslow.ssl.config; import org.eclipse.jetty.security.constraintmapping; import org.eclipse.jetty.security.constraintsecurityhandler; import org.eclipse.jetty.util.security.constraint; import org.eclipse.jetty.webapp.abstractconfiguration; import org.eclipse.jetty.webapp.webappcontext; public class httptohttpsjettyconfig extends abstractconfiguration { @override public void configure(webappcontext context) throws exception { constraint constraint = new constraint(); constraint.setdataconstraint(constraint.dc_confidential); constraintmapping mapping = new constraintmapping(); mapping.setpathspec("/*"); mapping.setconstraint(constraint); constraintsecurityhandler handler = new constraintsecurityhandler(); handler.addconstraintmapping(mapping); context.setsecurityhandler(handler); } }
2.2 同时打开http和https
webserverfactorycustomizerconfig
的功能主要是在有https
的前提下,还要提供http
,具体代码如下:
package com.pkslow.ssl.config; import org.eclipse.jetty.server.*; import org.springframework.beans.factory.annotation.value; import org.springframework.boot.web.embedded.jetty.configurablejettywebserverfactory; import org.springframework.boot.web.embedded.jetty.jettyservletwebserverfactory; import org.springframework.boot.web.server.webserverfactorycustomizer; import org.springframework.context.annotation.configuration; import java.util.collections; @configuration public class webserverfactorycustomizerconfig implements webserverfactorycustomizer<configurablejettywebserverfactory> { @value("${server.port}") private int httpsport; @value("${http.port}") private int httpport; @override public void customize(configurablejettywebserverfactory factory) { ((jettyservletwebserverfactory)factory).setconfigurations( collections.singleton(new httptohttpsjettyconfig()) ); factory.addservercustomizers( server -> { httpconfiguration httpconfiguration = new httpconfiguration(); httpconfiguration.setsecureport(httpsport); httpconfiguration.setsecurescheme("https"); serverconnector connector = new serverconnector(server); connector.addconnectionfactory(new httpconnectionfactory(httpconfiguration)); connector.setport(httpport); server.addconnector(connector); } ); } }
实现的重定向的结果如下:
2.3 更好玩的多http端口
有意思的是,我们可以实现多个http
端口同时启用,并都重定向到https
,增加代码如下即可:
serverconnector connector2 = new serverconnector(server); connector2.addconnectionfactory(new httpconnectionfactory(httpconfiguration)); connector2.setport(httpport + 1); server.addconnector(connector2);
效果如下,使用80
和81
端口都可以实现重定向:
3 总结
本文没有太多的原理可讲,之前的文章已经讲了不少https
相关的知识了,有兴趣的同学还是翻看之前的文章吧。
本文详细代码可在南瓜慢说公众号回复<springbootsslredirectjetty>获取。
欢迎访问获取更多精彩文章!
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
下一篇: 10. Go 语言流程控制:for 循环