Spring Boot項目結構

在配置HTTPS之前,了解Spring Boot項目的目錄結構是很重要的。這有助于我們更好地管理項目資源和配置文件。通常,一個Spring Boot項目的結構如下:

Spring Boot項目結構

添加依賴

pom.xml 文件中添加必要的依賴,以支持Web功能:



        org.springframework.boot
        spring-boot-starter-web
        2.6.7

這些依賴確保Spring Boot應用具備處理HTTP請求的能力。

配置application.yaml

通過 application.yaml 文件配置HTTPS相關參數:

server:
  ssl:
    key-store: classpath:https.keystore
    key-store-type: JKS
    key-alias: tomcat
    key-password: 123456
    key-store-password: 123456
  port: 8089

http:
  port: 8080

該配置定義了HTTPS的端口為8089,同時設置了一個HTTP端口8080用于重定向。

啟動類配置

HttpsApplication 類中啟動Spring Boot應用:

package com.liqq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HttpsApplication {
    public static void main(String[] args) {
        SpringApplication.run(HttpsApplication.class, args);
    }
}

HTTPS配置類

創建一個配置類,用于設置HTTP到HTTPS的重定向:

package com.liqq.config;

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.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpsConfig {

    @Value("${http.port}")
    private int httpPort;
    @Value("${server.port}")
    private int httpsPort;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(httpPort);
        connector.setSecure(false);
        connector.setRedirectPort(httpsPort);
        return connector;
    }
}

測試HTTPS配置

啟動Spring Boot應用后,訪問 http://localhost:8080/log ,瀏覽器會自動重定向到 https://localhost:8089/log 。此時,應用已通過HTTPS安全傳輸。

HTTPS配置成功示例

Vert.x訪問控制Demo

Vert.x是一個輕量級、事件驅動的應用框架,適合構建異步網絡應用。接下來,我們將展示如何在Vert.x中實現簡單的登錄訪問控制。

聲明和依賴

首先,我們需要聲明Vert.x項目的依賴:


    UTF-8
    4.2.4

            io.vertx
            vertx-stack-depchain
            ${vertx.version}
            pom
            import

        io.vertx
        vertx-web

這些依賴確保我們的Vert.x應用可以處理Web請求和用戶認證。

自定義登錄控制

下面的代碼展示了如何在Vert.x中實現登錄控制:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.User;
import io.vertx.ext.web.Router;

public class MainVerticle extends AbstractVerticle {
    boolean login = false;
    @Override
    public void start(Promise startPromise) throws Exception {

        Router router = Router.router(vertx);

        router.route("/login").handler(context -> {
            MultiMap queryParams = context.queryParams();
            String username = queryParams.get("username");
            String password = queryParams.get("password");
            User user = User.create(new JsonObject().put("username", username).put("password", password));
            context.setUser(user);
            login = true;
            context.json(new JsonObject().put("status", 200).put("msg", "login success!"));
        });

        router.route().handler(context -> {
            User user = context.user();
            if (!login) {
                context.json(new JsonObject().put("status", 500).put("msg", "no login"));
            } else {
                context.next();
            }
        });

        router.route("/logout").handler(context -> {
            login = false;
            context.json(new JsonObject().put("status", 200).put("msg", "login out success!"));
        });

        router.route("/hello").method(HttpMethod.GET).handler(context -> {
            context.json(new JsonObject().put("status", 200).put("msg", "ok"));
        });

        vertx.createHttpServer()
            .requestHandler(router)
            .listen(8888)
            .onSuccess(server ->
                System.out.println("HTTP server started on port " + server.actualPort())
            );
    }
}

測試登錄控制

啟動Vert.x應用后,訪問 http://localhost:8888/hello ,如果未登錄,將返回未認證的消息。登錄后,可以正常訪問受保護的資源。

基于Session的登錄控制

使用Session機制可以更好地管理用戶認證狀態。以下是相關代碼示例:

@Override
public void start(Promise startPromise) throws Exception {

    Router router = Router.router(vertx);
    router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)));

    router.route("/login").handler(context -> {
        MultiMap queryParams = context.queryParams();
        String username = queryParams.get("username");
        String password = queryParams.get("password");

        if ("admin".equals(username) && "admin".equals(password)) {
            User user = User.create(new JsonObject().put("username", username).put("password", password));
            context.setUser(user);
            context.json(new JsonObject().put("status", 200).put("msg", "login success!"));
        } else {
            context.json(new JsonObject().put("status", 500).put("msg", "login failed!"));
        }
    });

    router.route("/hello").method(HttpMethod.GET).handler(context -> {
        context.json(new JsonObject().put("status", 200).put("msg", "ok"));
    });

    vertx.createHttpServer()
        .requestHandler(router)
        .listen(8888)
        .onSuccess(server ->
            System.out.println("HTTP server started on port " + server.actualPort())
        );
}

通過這種方式,我們可以輕松管理用戶的登錄狀態,并確保只有經過認證的用戶可以訪問受保護的資源。

結論

通過本文的介紹,我們學習了如何在Spring Boot中配置HTTPS和在Vert.x中實現訪問控制。這些技術可以幫助開發人員構建更加安全和可靠的Web應用。希望本文能為您在實際項目中提供有價值的參考。

FAQ

  1. 問:Spring Boot中如何確保HTTPS配置的安全性?

  2. 問:如何在Vert.x中實現多用戶的訪問控制?

  3. 問:HTTPS和HTTP的主要區別是什么?

  4. 問:在Vert.x應用中如何處理用戶注銷?

  5. 問:Spring Boot和Vert.x各自的優點是什么?

上一篇:

5分鐘掌握2024 pip 國內源配置

下一篇:

基于YOLO的小樣本目標檢測:挑戰與解決方案
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費