Vert.x 4.2.0中使用WebApiServiceGen时如何设置与获取Session?
Vert.x 4.2.0中结合@WebApiServiceGen操作Session的方法
嘿,很高兴你已经搞定了@WebApiServiceGen的实现!关于Session的设置与获取,其实Vert.x Web本身就有完善的Session支持,结合你手头的ServiceRequest和ServiceResponse对象,有几种实用的方式,我给你一步步拆解:
方法一:通过ServiceRequest获取底层HttpServerRequest操作Session
ServiceRequest内部持有Vert.x Web的HttpServerRequest实例,你可以直接拿到它,然后用Vert.x原生的Session API来操作——不过要注意Session的获取是异步的,因为它可能需要从存储中加载:
1. 先确保路由中启用Session支持
在你配置Web路由的时候,必须添加SessionHandler,否则无法获取Session:
Router router = Router.router(vertx); // 配置Session存储(示例用内存存储,生产环境建议用Redis等分布式存储) SessionStore sessionStore = LocalSessionStore.create(vertx); SessionHandler sessionHandler = SessionHandler.create(sessionStore); // 把SessionHandler添加到全局路由链 router.route().handler(sessionHandler); // 挂载你的WebApiService(比如用WebApiServiceRouter生成路由) WebApiServiceRouter.router(vertx, yourServiceInstance, router);
2. 在Service方法中操作Session
拿到ServiceRequest后,先获取底层的HttpServerRequest,再异步获取Session进行操作:
@Override public void yourServiceMethod(ServiceRequest request, ServiceResponse response) { // 获取底层HttpServerRequest HttpServerRequest httpRequest = request.request(); // 异步获取Session(如果不存在会自动创建) httpRequest.session(sessionResult -> { if (sessionResult.succeeded()) { Session session = sessionResult.result(); // 设置Session属性 session.put("user_id", "12345"); // 获取Session属性 String userId = session.get("user_id"); // 处理业务逻辑,然后返回响应 response.setStatusCode(200).end("Session操作完成,user_id: " + userId); } else { // 处理Session获取失败的情况 Throwable error = sessionResult.cause(); response.setStatusCode(500).end("获取Session失败: " + error.getMessage()); } }); }
方法二:自定义扩展ServiceRequest封装Session(适合自定义注解处理器的场景)
既然你是自己实现的@WebApiServiceGen注解处理器,那可以在生成代码的时候,提前把Session注入到自定义的Request对象中,让业务代码调用更简洁:
1. 自定义带Session的Request类
public class SessionAwareServiceRequest extends ServiceRequest { private final Session session; public SessionAwareServiceRequest(ServiceRequest delegate, Session session) { super(delegate); this.session = session; } public Session getSession() { return session; } }
2. 在注解处理器生成的代码中注入Session
在生成Service实现类的路由处理代码时,先异步获取Session,再把SessionAwareServiceRequest传给你的业务方法:
// 这是注解处理器生成的代码示例 router.get("/your-api-path").handler(ctx -> { ctx.request().session(sessionResult -> { if (sessionResult.succeeded()) { Session session = sessionResult.result(); ServiceRequest originalRequest = new ServiceRequestImpl(ctx); SessionAwareServiceRequest request = new SessionAwareServiceRequest(originalRequest, session); ServiceResponse response = new ServiceResponseImpl(ctx); // 调用你的业务方法 yourService.yourServiceMethod(request, response); } else { ctx.response().setStatusCode(500).end("Session初始化失败"); } }); });
3. 业务方法中直接使用Session
这样你的业务代码就不用再处理异步逻辑,直接调用getSession()即可:
@Override public void yourServiceMethod(SessionAwareServiceRequest request, ServiceResponse response) { Session session = request.getSession(); // 直接操作Session session.put("username", "IgaSeha"); String username = session.get("username"); response.setStatusCode(200).end("Hello, " + username); }
注意事项
- 异步处理:Vert.x的Session获取是异步操作,不要在同步代码中直接阻塞等待,一定要用回调、
Future或者RxJava来处理异步结果。 - 分布式场景:如果你的服务是多实例部署,不要用
LocalSessionStore,换成RedisSessionStore或者其他分布式Session存储,避免Session无法共享。 - Session配置:可以通过
SessionHandler设置Session的超时时间、Cookie名称等参数,比如sessionHandler.setSessionTimeout(3600000)(1小时超时)。
内容的提问来源于stack exchange,提问作者IgaSeha
相关产品推荐
相关产品推荐

