2. Spring Boot項(xiàng)目結(jié)構(gòu)

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

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應(yīng)用具備處理HTTP請(qǐng)求的能力。

4. 配置application.yaml

通過(guò)application.yaml文件配置HTTPS相關(guān)參數(shù):

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,同時(shí)設(shè)置了一個(gè)HTTP端口8080用于重定向。

5. 啟動(dòng)類配置

HttpsApplication類中啟動(dòng)Spring Boot應(yīng)用:

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配置類

創(chuàng)建一個(gè)配置類,用于設(shè)置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. 測(cè)試HTTPS配置

啟動(dòng)Spring Boot應(yīng)用后,訪問(wèn)http://localhost:8080/log,瀏覽器會(huì)自動(dòng)重定向到https://localhost:8089/log。此時(shí),應(yīng)用已通過(guò)HTTPS安全傳輸。

Vert.x訪問(wèn)控制Demo

Vert.x是一個(gè)輕量級(jí)、事件驅(qū)動(dòng)的應(yīng)用框架,適合構(gòu)建異步網(wǎng)絡(luò)應(yīng)用。接下來(lái),我們將展示如何在Vert.x中實(shí)現(xiàn)簡(jiǎn)單的登錄訪問(wèn)控制。

1. 聲明和依賴

首先,我們需要聲明Vert.x項(xiàng)目的依賴:

<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應(yīng)用可以處理Web請(qǐng)求和用戶認(rèn)證。

2. 自定義登錄控制

下面的代碼展示了如何在Vert.x中實(shí)現(xiàn)登錄控制:

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. 測(cè)試登錄控制

啟動(dòng)Vert.x應(yīng)用后,訪問(wèn)http://localhost:8888/hello,如果未登錄,將返回未認(rèn)證的消息。登錄后,可以正常訪問(wèn)受保護(hù)的資源。

4. 基于Session的登錄控制

使用Session機(jī)制可以更好地管理用戶認(rèn)證狀態(tài)。以下是相關(guān)代碼示例:

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

通過(guò)這種方式,我們可以輕松管理用戶的登錄狀態(tài),并確保只有經(jīng)過(guò)認(rèn)證的用戶可以訪問(wèn)受保護(hù)的資源。

結(jié)論

通過(guò)本文的介紹,我們學(xué)習(xí)了如何在Spring Boot中配置HTTPS和在Vert.x中實(shí)現(xiàn)訪問(wèn)控制。這些技術(shù)可以幫助開發(fā)人員構(gòu)建更加安全和可靠的Web應(yīng)用。希望本文能為您在實(shí)際項(xiàng)目中提供有價(jià)值的參考。

FAQ

  1. 問(wèn):Spring Boot中如何確保HTTPS配置的安全性?
  1. 問(wèn):如何在Vert.x中實(shí)現(xiàn)多用戶的訪問(wèn)控制?
  1. 問(wèn):HTTPS和HTTP的主要區(qū)別是什么?
  1. 問(wèn):在Vert.x應(yīng)用中如何處理用戶注銷?
  1. 問(wèn):Spring Boot和Vert.x各自的優(yōu)點(diǎn)是什么?

上一篇:

RAG 流式輸出如何返回

下一篇:

Auto-Dev編碼器:下一代智能編碼助手的技術(shù)演進(jìn)與應(yīng)用實(shí)踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)