
ChatGPT API 申請與使用全攻略
在配置HTTPS之前,了解Spring Boot項目的目錄結構是很重要的。這有助于我們更好地管理項目資源和配置文件。通常,一個Spring Boot項目的結構如下:
在 pom.xml
文件中添加必要的依賴,以支持Web功能:
org.springframework.boot
spring-boot-starter-web
2.6.7
這些依賴確保Spring Boot應用具備處理HTTP請求的能力。
通過 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);
}
}
創建一個配置類,用于設置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;
}
}
啟動Spring Boot應用后,訪問 http://localhost:8080/log
,瀏覽器會自動重定向到 https://localhost:8089/log
。此時,應用已通過HTTPS安全傳輸。
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機制可以更好地管理用戶認證狀態。以下是相關代碼示例:
@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應用。希望本文能為您在實際項目中提供有價值的參考。
問:Spring Boot中如何確保HTTPS配置的安全性?
問:如何在Vert.x中實現多用戶的訪問控制?
問:HTTPS和HTTP的主要區別是什么?
問:在Vert.x應用中如何處理用戶注銷?
context.clearUser()
方法清除會話中的用戶信息,并返回注銷成功的消息。問:Spring Boot和Vert.x各自的優點是什么?