使用 Infinispan 客户端存储 Web 会话

本文档将向您展示如何将 Vert.x Web 会话存储在 Infinispan 中。

您将构建什么

您将构建一个 Vert.x Web 应用程序,该应用程序会显示:

  • 会话 ID 和会话创建时间

  • 页面生成时间

run

该应用程序包含在一个 ServerVerticle 类中。

您需要什么

  • 文本编辑器或 IDE

  • Java 11 或更高版本

  • Maven 或 Gradle

  • Infinispan 集群(或 Docker)

创建项目

此项目的代码包含功能等效的 Maven 和 Gradle 构建文件。

使用 Maven

以下是您应该使用的 pom.xml 文件的内容

使用 Gradle

假设您使用带有 Kotlin DSL 的 Gradle,您的 build.gradle.kts 文件应如下所示

使用 Infinispan 存储和检索会话数据

Vert.x Web 的 SessionStore 接口提供了读取和修改会话数据的方法。

InfinispanSessionStore 实现可在 io.vertx:vertx-web-sstore-infinispan artifact 中找到。

以下是 ServerVerticle 类的代码

package io.vertx.howtos.web.sessions;

import io.vertx.core.Future;
import io.vertx.core.VerticleBase;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.Session;
import io.vertx.ext.web.handler.SessionHandler;
import io.vertx.ext.web.sstore.SessionStore;
import io.vertx.ext.web.sstore.infinispan.InfinispanSessionStore;

import java.util.Date;

public class ServerVerticle extends VerticleBase {

  public static final String TEMPLATE = ""
    + "Session [%s] created on %s%n"
    + "%n"
    + "Page generated on %s%n";

  @Override
  public Future<?> start() {
    Router router = Router.router(vertx);

    JsonObject options = new JsonObject()
      .put("servers", new JsonArray()
        .add(new JsonObject()
          .put("host", "localhost")
          .put("port", 11222)
          .put("username", "admin")
          .put("password", "bar"))
      );
    SessionStore store = InfinispanSessionStore.create(vertx, options); // (1)

    router.route().handler(SessionHandler.create(store)); // (2)

    router.get("/").handler(ctx -> {
      Session session = ctx.session();
      session.computeIfAbsent("createdOn", s -> System.currentTimeMillis()); // (3)

      String sessionId = session.id();
      Date createdOn = new Date(session.<Long>get("createdOn"));
      Date now = new Date();

      ctx.end(String.format(TEMPLATE, sessionId, createdOn, now)); // (4)
    });

    return vertx.createHttpServer()
      .requestHandler(router)
      .listen(8080);
  }

  public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    vertx.deployVerticle(new ServerVerticle()).await();
  }
}
  1. 使用您的 Infinispan 集群配置(例如,主机、端口和凭据)创建一个 InfinispanSessionStore

  2. 注册管理 Vert.x Web 会话的 SessionHandler

  3. 将会话创建时间戳放入会话数据中。

  4. 创建响应正文并将其发送给客户端。

运行应用程序

如果您不熟悉 Infinispan,请查看其简介

要在您的机器上使用 Docker 运行 Infinispan 服务器,请打开终端并执行以下命令:

docker run -p 11222:11222 -e USER="admin" -e PASS="bar" infinispan/server:14.0
注意
如果您已经有一个 Infinispan 集群正在运行,请不要忘记更新 ServerVerticle 中的配置(主机、端口和凭据)。

ServerVerticle 已经包含 main 方法,因此可以直接用于:

  1. 创建一个 Vertx 上下文,然后

  2. 部署 ServerVerticle

您可以从以下位置运行应用程序

  1. 或者在您的 IDE 中,通过运行 ServerVerticle 类的 main 方法。

  2. 使用 Maven:mvn compile exec:java,或者

  3. 使用 Gradle:./gradlew run(Linux、macOS)或 gradle run(Windows)。

测试应用程序

  1. 浏览至 https://:8080。如果您是首次请求此页面,会话创建时间应与页面生成时间相同。

  2. 现在,我们通过停止应用程序并重新启动来模拟故障转移到另一个 Web 服务器。

  3. 新的 Web 服务器启动后,再次浏览至 https://:8080。会话 ID 和会话创建时间不应发生变化(因为会话数据已持久化到 Infinispan 中)。

总结

本文档涵盖了

  1. 创建 InfinispanSessionStore 实例,

  2. 注册 Vert.x Web SessionHandler

  3. 修改会话数据。


最后发布:2025-02-03 01:15:19 +0000。