2. Spring Boot項目結構

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

3. 添加依賴

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

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>
</dependencies>

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

4. 配置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用于重定向。

5. 啟動類配置

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

6. 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;
}
}

7. 測試HTTPS配置

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

Vert.x訪問控制Demo

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

1. 聲明和依賴

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

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<vertx.version>4.2.4</vertx.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-stack-depchain</artifactId>
<version>${vertx.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
</dependency>
</dependencies>

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

2. 自定義登錄控制

下面的代碼展示了如何在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<Void> 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("{"status":200,"msg":"ok"}"));
});

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

3. 測試登錄控制

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

4. 基于Session的登錄控制

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

@Override
public void start(Promise<Void> 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("{"status":200,"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配置的安全性?
  1. 問:如何在Vert.x中實現多用戶的訪問控制?
  1. 問:HTTPS和HTTP的主要區別是什么?
  1. 問:在Vert.x應用中如何處理用戶注銷?
  1. 問:Spring Boot和Vert.x各自的優點是什么?

上一篇:

RAG 流式輸出如何返回

下一篇:

Auto-Dev編碼器:下一代智能編碼助手的技術演進與應用實踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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