当前,当用户使用网络 POST
表单、自定义身份 validator 和自定义用户登录到我的网络服务器时。我将 CustomUser
放入 RoutingContext
提供的 Session
中,因为在使用 RoutingContext#setUser
时它只会改变该请求的用户,一旦用户从登录处理页面重定向到他们的目的地,CustomUser
就会丢失。
但是,新页面的 RoutingContext
中的 Session
似乎也没有任何用户存储在 auth 放置 的条目中CustomUser
,这会发送一个完全不同的 Session
吗?
路由
:
//ROUTE DEFINITIONS
// SESSION AND COOKIE
router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)).setNagHttps(false)); //TODO SSL
router.route().handler(CookieHandler.create());
// STATIC
router.route("/").handler(new StaticHandler()); //BASE
router.route("/admin").handler(new StaticHandler()); //ADMIN PAGE
// FORM REQUESTS
router.route("/login").handler(new AuthAndRegHandler(new CustomAuth(), dbController)); //LOGIN REQUEST
router.route("/logout").handler(new AuthAndRegHandler(new CustomAuth(), dbController)); //LOGOUT REQUEST
// AJAX
router.route("/ajax/updateInvoice").handler(new AjaxHandler());
// ERRORS
router.route().failureHandler(new ErrorHandler());
router.route().handler(handle -> {
handle.fail(404);
});
//END DEFINITIONS
AuthAndRegHandler
:
public class AuthAndRegHandler extends AuthHandlerImpl {
private DatabaseController db;
private CustomAuth authProvider;
public AuthAndRegHandler(CustomAuth authProvider, DatabaseController db) {
super(authProvider);
this.db = db;
this.authProvider = authProvider;
}
@Override
public void handle(RoutingContext event) {
Logger log = LoggerFactory.getLogger(this.getClass());
HttpServerResponse response = event.response();
HttpServerRequest request = event.request();
Session session = event.session();
String requestedPath = request.path();
authProvider.setJdbc(db.getJdbc()); //returns a JDBCClient
if(requestedPath.equalsIgnoreCase("/login")) {
if(request.method() != HttpMethod.POST)
event.fail(500);
else {
request.setExpectMultipart(true);
request.endHandler(handle -> {
MultiMap formAtts = request.formAttributes();
String email = formAtts.get("email");
String pw = formAtts.get("password");
log.info(email + ":" + pw + " login attempt");
authProvider.authenticate(new JsonObject()
.put("username", email)
.put("password", pw), res -> {
if(res.succeeded()) {
CustomUser userToSet = (CustomUser) res.result();
session.put("user", userToSet);
log.info("Login successful for " + email);
response.putHeader("Location", "/").setStatusCode(302).end();
} else {
event.fail(500);
log.error("Auth error for " + request.host());
}
});
});
}
}
}
}
CustomAuth
每次都返回 true 以进行测试。
静态处理器
CustomUser user = session.get("user");
event.setUser(user);
response.putHeader("Content-Type", "text/html");
if(user != null) {
log.info(user.principal().getString("email") + " user detected");
event.setUser(user);
} else
log.info("Null user request detected"); //Constantly outputs, even after a login form has been submitted
我不完全确定这里出了什么问题。 Vertx 为像我这样的菜鸟提供了次优的文档,并且在没有开箱即用的情况下处理事情。任何有关如何让某人登录并像普通网站一样维护他们的 session 的帮助将不胜感激。
最佳答案
对于那些偶然发现同样问题但通常跳过评论的人:
Vert.x SessionHandler 依赖于 CookieHandler,这里的顺序很重要。
来自Vert.x examples :
router.route().handler(CookieHandler.create());
router.route().handler(sessionHandler);
关于java - 使用 vertx 处理 session 并记住登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150013/