Spring Boot 配置http与https
admin 发布于:2022-05-09 21:54:20
阅读:loading
本站博客1.0的实现有使用到了基于https安全协议访问,大概的实现是从阿里云申请免费的https证数(有效期一年,过期可继续申请),加上外置的Tomcat进行的参数配置,实现的https访问支持(当访问的是http协议时自动跳转至https)。那么本站2.0基于Spring Boot技术架构实现的,自然需要考虑这一特性,所以本篇文章主要实现的是让example项目同时支持http和https两种协议的支持,详细实现如下。
关于https证数的下载可从阿里云免费下载,同时也可以使用JDK bin目录中的命令行工具keytool自行生成证数。本次选择稍微熟悉点的阿里云证数,所以跳过具体证数的下载(本站的全局搜索功能能够搜到到关于https文章试提到的免费证数下载及配置相关的文章)。
application.yaml
#server
server:
  port: 443
  http-port: 80
  servlet:
    context-path: /
  ssl:
    enabled: true
    key-store: "classpath:ssl/www.chendd.cn.pfx"
    key-store-password: z1JSquRDBoostrap.java
package cn.chendd;
import ...;
/**
 * 启动类
 *
 * @author chendd
 * @date 2022/5/8 20:09
 */
@SpringBootApplication(exclude = {FreeMarkerAutoConfiguration.class})
@Import(value = {ContextConfiguration.class , SwaggerConfiguration.class , FreemarkerConfiguration.class})
public class Bootstrap {
    /**
     * 服务器启动
     * @param args 启动参数
     */
    public static void main(String[] args) {
        SoutCounter.sign("Bootstrap.main###启动类启动前输出一句话");
        SpringApplication.run(Bootstrap.class , args);
        SoutCounter.sign("Bootstrap.main###启动类启动后输出一句话");
    }
    @Value("${server.http-port}")
    private Integer httpPort;
    @Value("${server.port}")
    private Integer httpsPort;
    /**
     * 定制web-server服务器,绑定http访问协议与端口等
     * @return server服务器设置
     */
    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                //设置安全性约束
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint(ServletSecurity.TransportGuarantee.CONFIDENTIAL.name());
                //设置约束条件
                SecurityCollection collection = new SecurityCollection();
                //拦截所有请求
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        //设置http访问
        Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        httpConnector.setPort(httpPort);
        httpConnector.setRedirectPort(httpsPort);
        ///如果设置了setSecure为true则http不会自动转向至https
        //httpConnector.setSecure(true);
        tomcat.addAdditionalTomcatConnectors(httpConnector);
        return tomcat;
    }
    @RestController
    public static class IndexController {
        @RequestMapping(value = "/")
        public void index(HttpServletRequest request , HttpServletResponse response) throws IOException {
            StringBuffer requestURL = RequestUtil.getRequestURL(request);
            String content = String.format("<h1>hello chendd URL = %1$s</h1>" , requestURL);
            response.getWriter().println(content);
        }
    }
}
(首页访问)

(启动输出http和https及对应端口号)
(1)服务器启动时输出支持的https和http协议以及端口号,端口号是由application.yaml配置文件中定义;
(2)server.port设置的443是https协议默认端口,配合启用https参数表示使用https协议访问;同时80端口是定制tomcat参数时指定的http协议端口,同时定制tomcat时有过滤器拦截所有的请求,将http协议自动转向至https协议对应的功能页面;
(3)上述运行示例的首页访问图中,访问的是http的地址,自动转向至对应的https地址;
(4)由于证数使用的www.chendd.cn域名,故运行示例时在host文件中将www.chendd.cn域名指向了localhost地址;
源码工程下载:
源码下载.zip;
点赞
                
            
                
            
                
            
                
            
                
            
                                    
                                    
                                    
                                    
                                    
                                    
欢迎来到陈冬冬的学习天地 | 学习与经验整理分享平台