Springboot以Jetty為容器實現http重定向到https


1 簡介

之前講解的Springboot整合https用的是tomcat作為容器,tomcat也是一個流行多年的老牌Java容器了。但針對不同的場景,還是會有不同的選擇,如JettyJetty是架構相對簡單、基於Handler的靈活可擴展的Servlet容器。更多詳情請參考官方文檔

另外建議閱讀其它相關文章:

(1)Springboot整合https原來這么簡單

(2)HTTPS之密鑰知識與密鑰工具Keytool和Keystore-Explorer

(3)Springboot以Tomcat為容器實現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);
                }
        );
    }
}

實現的重定向的結果如下:

Jetty Redirect

2.3 更好玩的多http端口

有意思的是,我們可以實現多個http端口同時啟用,並都重定向到https,增加代碼如下即可:

ServerConnector connector2 = new ServerConnector(server);
connector2.addConnectionFactory(new HttpConnectionFactory(httpConfiguration));
connector2.setPort(httpPort + 1);

server.addConnector(connector2);

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

Jetty Redirect Multiple Ports

3 總結

本文沒有太多的原理可講,之前的文章已經講了不少https相關的知識了,有興趣的同學還是翻看之前的文章吧。

本文詳細代碼可在南瓜慢說公眾號回復<SpringbootSSLRedirectJetty>獲取。


歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM