0

我希望在将用户发送到登录之前检查会话 - 每个 URL 请求都会导致检查这是否来自有效会话 - 如果不是,则将它们发送到登录页面,否则正常处理。如果用户已经有一个活动会话,我们不会向他们显示登录页面,而是将他们带到预定义的主页。

我在谷歌上搜索了与它相关的东西,知道它会通过@Before在控制器中使用注释来完成,但不知道如何@Before工作以及如何使用?我正在使用播放 1.2.5。

4

2 回答 2

4

您可以通过这种方式使用@Before:

@Before
static void addUser() {
    User user = connected();
    if(user != null) {
        renderArgs.put("user", user);
    }
}

static User connected() {
    if(renderArgs.get("user") != null) {
        return renderArgs.get("user", User.class);
    }
    // Find your user from session
    String username = session.get("user");
    if(username != null) {
        return User.find("byUsername", username).first();
    } 
    return null;
}

// ~~render your login if the user is not finded in session

public static void index() {
    if(connected() != null) {
         render();
    }
    login();
}

您可以在 YOUR_PLAY_DIR/samples-and-tests/booking 中找到此示例代码。

正如@emt14 所说,您可以使用 Play 安全模块更轻松地做到这一点。查看 YOUR_PLAY_DIR/samples-and-tests/forum 中的论坛应用示例。

于 2012-11-07T16:37:50.303 回答
2

Play 安全模块开箱即用。它被大多数应用程序使用,并且还与不同的插件集成。在此处查看文档。

如果您仍然想自己实现它,您可以使用安全代码作为示例。

否则,@Before可以用于您的任何控制器静态方法,并且可以访问所有范围对象,包括会话。

于 2012-11-05T08:28:16.043 回答