文档章节

spring-boot实现访问http跳转到https端口的方法

阿信sxq
 阿信sxq
发布于 2017/05/02 21:05
字数 643
阅读 583
收藏 4

实现访问服务器地址(默认http的80)跳转到https端口(443)

开启端口监听

因为https默认是443端口,需要开启对443端口的监听

在application.properties中

#web监听端口
server.port = 443

配置ssl证书

由于没有从相关机构申请证书,使用jdk自带的证书管理工具进行生成,方法如下

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

这个命令需要交互输入一些密码以及组织的相关信息,这些信息再后面的配置中会使用到

会生成一个名为keystore.p12的文件,这个文件就是我们需要使用的文件,将其放置到resources目录下

在application.properties中配置

#https
server.ssl.enabled=true
server.ssl.key-store= classpath:keystore.p12
server.ssl.protocol=TLS
server.ssl.key-store-password= 自定义
server.ssl.keyStoreType= PKCS12
server.ssl.keyAlias= tomcat

配置跳转

创建下面的配置类

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.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 设置将访问80端口的请求跳转到指定的端口上去,这样用户就可以直接输入设备地址访问而不需要输入前缀和端口了
 *
 * @author 阿信sxq
 *
 */
@Configuration
public class ContainerCustomizer {

    @Value("${server.port}")
    private Integer webPort;

    /**
     * 构建servlet容器的工厂类
     * 将80端口跳转到{@linkplain #webPort}端口
     *
     * @return 内置servlet容器类的工厂实例
     */
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {

            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createConnector());
        return factory;
    }

    /**
     * 创建tomcat连接器。
     * 该连接器将会接收http的80端口的访问,并且重定向到指定的端口上去,{@linkplain #webPort}
     *
     * @return tomcat连接器
     */
    private Connector createConnector() {
        final Connector connector = new Connector();

        connector.setPort(80);
        connector.setRedirectPort(webPort);
        return connector;
    }
}

这个是使用内置的tomcat做容器的配置方式,使用jetty需要使用另外的方式

jetty配置跳转

下面的代码来自http://stackoverflow.com/questions/26655875/spring-boot-redirect-http-to-https,
由于没有使用jetty,所以没有进行验证

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;

class HttpToHttpsJettyConfiguration extends AbstractConfiguration {
    // http://wiki.eclipse.org/Jetty/Howto/Configure_SSL#Redirecting_http_requests_to_https
    @Override
    public void configure(WebAppContext context) throws Exception {
        Constraint constraint = new Constraint();
        constraint.setDataConstraint(2);

        ConstraintMapping constraintMapping = new ConstraintMapping();
        constraintMapping.setPathSpec("/*");
        constraintMapping.setConstraint(constraint);

        ConstraintSecurityHandler constraintSecurityHandler = new ConstraintSecurityHandler();
        constraintSecurityHandler.addConstraintMapping(constraintMapping);

        context.setSecurityHandler(constraintSecurityHandler);
    }
}
@Configuration
public class HttpToHttpsJettyCustomizer implements EmbeddedServletContainerCustomizer{
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        JettyEmbeddedServletContainerFactory containerFactory = (JettyEmbeddedServletContainerFactory) container;
        //Add a plain HTTP connector and a WebAppContext config to force redirect from http->https
        containerFactory.addConfigurations(new HttpToHttpsJettyConfiguration());

        containerFactory.addServerCustomizers(server -> {
            HttpConfiguration http = new HttpConfiguration();
            http.setSecurePort(443);
            http.setSecureScheme("https");

            ServerConnector connector = new ServerConnector(server);
            connector.addConnectionFactory(new HttpConnectionFactory(http));
            connector.setPort(80);

            server.addConnector(connector);
        });
    }
}

特别说明

使用上面的方法配置的https由于证书不是受信的,所以浏览器会报警告,需要手工确认,这个没办法

© 著作权归作者所有

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 227
博文 83
码字总数 73652
作品 1
成都
后端工程师
私信 提问
加载中

评论(2)

阿信sxq
阿信sxq

引用来自“国栋”的评论

受信证书通常都要钱,这点比较麻烦
确实,不过有一个let's encrypt,免费的,还没有整过
国栋
国栋
受信证书通常都要钱,这点比较麻烦
微服务 SpringBoot 2.0(八):静态资源和拦截器处理

一文搞清楚静态资源和拦截器 —— Java面试必修 引言 接触一个web项目,首先要确认的就是入口,所以静态资源和拦截器在项目中是架构级的,在第五章我们整合了Thymeleaf模块,初次认识了Sprin...

阿郎_
2018/09/29
0
0
一步步实现web程序信息管理系统之二--后台框架实现跳转登陆页面

SpringBoot springboot的目的是为了简化spring应用的开发搭建以及开发过程。内部使用了特殊的处理,使得开发人员不需要进行额外繁锁的xml文件配置的编写,其内部包含很多模块的配置只需要添加...

编程SHA
2018/11/08
0
0
《Spring Boot极简教程》第16章 Spring Boot安全集成Spring Security

第16章 Spring Boot安全集成Spring Security 开发Web应用,对页面的安全控制通常是必须的。比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通过Aop...

程序员诗人
2017/04/17
0
0
Spring Security实现RBAC权限管理

Spring Security实现RBAC权限管理 一简介 在企业应用中,认证和授权是非常重要的一部分内容,业界最出名的两个框架就是大名鼎鼎的 Shiro和Spring Security。由于Spring Boot非常的流行,选择...

小忽悠
2018/06/21
0
0
Spring Boot干货系列:(六)静态资源和拦截器处理

     前言   本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter。   正文   前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持,...

后端编程嘟
2017/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitMQ 在spring 的使用

一、准备工作 maven依赖 <dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  <version>4.0.2</version></dependency> <dependency......

狼王黄师傅
昨天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
6
0
day26:shell题

1、 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为AuthenticAMD,就显示其为AMD公司; 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,...

芬野de博客
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部