
實(shí)時(shí)航班追蹤背后的技術(shù):在線飛機(jī)追蹤器的工作原理
在配置HTTPS之前,了解Spring Boot項(xiàng)目的目錄結(jié)構(gòu)是很重要的。這有助于我們更好地管理項(xiàng)目資源和配置文件。通常,一個(gè)Spring Boot項(xiàng)目的結(jié)構(gòu)如下:
在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)求的能力。
通過(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用于重定向。
在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);
}
}
創(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;
}
}
啟動(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是一個(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)控制。
首先,我們需要聲明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)證。
下面的代碼展示了如何在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())
);
}
}
啟動(dòng)Vert.x應(yīng)用后,訪問(wèn)http://localhost:8888/hello
,如果未登錄,將返回未認(rèn)證的消息。登錄后,可以正常訪問(wèn)受保護(hù)的資源。
使用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ù)的資源。
通過(guò)本文的介紹,我們學(xué)習(xí)了如何在Spring Boot中配置HTTPS和在Vert.x中實(shí)現(xiàn)訪問(wèn)控制。這些技術(shù)可以幫助開發(fā)人員構(gòu)建更加安全和可靠的Web應(yīng)用。希望本文能為您在實(shí)際項(xiàng)目中提供有價(jià)值的參考。
context.clearUser()
方法清除會(huì)話中的用戶信息,并返回注銷成功的消息。對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)