欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot以Jetty为容器实现http重定向到https

程序员文章站 2022-10-03 18:27:11
1 简介 之前讲解的 整合 用的是 作为容器, 也是一个流行多年的老牌Java容器了。但针对不同的场景,还是会有不同的选择,如 。`Jetty Handler Servlet`容器。更多详情请参考 "官方文档" 。 另外建议阅读其它相关文章: (1) "Springboot整合https原来这么简单 ......

1 简介

之前讲解的springboot整合https用的是tomcat作为容器,tomcat也是一个流行多年的老牌java容器了。但针对不同的场景,还是会有不同的选择,如jettyjetty是架构相对简单、基于handler的灵活可扩展的servlet容器。更多详情请参考。

另外建议阅读其它相关文章:

(1)springboot整合https原来这么简单

(2)https之密钥知识与密钥工具keytool和keystore-explorer

(3)springboot以tomcat为容器实现http重定向到https的两种方式

Springboot以Jetty为容器实现http重定向到https

2 重定向实现

为了代码结构清晰一点,把配置拆成两个类。

2.1 重定向

httptohttpsjettyconfig是与jetty强相关的配置类,继承于abstractconfiguration,以便后续用于webserverfactory的设置,如果没有这个类的配置,那就会同时具有httphttps服务,无法重定向。这个类的配置要求连接必须是安全的。具体代码如下:

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);
                }
        );
    }
}

实现的重定向的结果如下:

Springboot以Jetty为容器实现http重定向到https

2.3 更好玩的多http端口

有意思的是,我们可以实现多个http端口同时启用,并都重定向到https,增加代码如下即可:

serverconnector connector2 = new serverconnector(server);
connector2.addconnectionfactory(new httpconnectionfactory(httpconfiguration));
connector2.setport(httpport + 1);

server.addconnector(connector2);

效果如下,使用8081端口都可以实现重定向:

Springboot以Jetty为容器实现http重定向到https

3 总结

本文没有太多的原理可讲,之前的文章已经讲了不少https相关的知识了,有兴趣的同学还是翻看之前的文章吧。

本文详细代码可在南瓜慢说公众号回复<springbootsslredirectjetty>获取。


欢迎访问获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

Springboot以Jetty为容器实现http重定向到https

多读书,多分享;多写作,多整理。