java - 使用 vertx 处理 session 并记住登录用户

标签 java java-8 vert.x

当前,当用户使用网络 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/

相关文章:

JavaFX - 处理按钮上的 MouseEntered 事件(使用 fxml)

java - 使用流 API 合并列表

maven - 使用 Maven 从 Vertx 项目构建 war 文件

cluster-computing - Vertx 聚类替代方案

java - 为什么添加类路径导致找不到主类?

java - 为什么这个 Java 正则表达式会导致 "illegal escape character"错误?

java-8 - Java 8 - 具有嵌套对象的比较器

java - 顶点 : handling POST body is so slow

java - 如何在数据库连接中正确使用try-with-resources?

java - 使用 Java 8 Stream API 进行计数和排序