我希望在将用户发送到登录之前检查会话 - 每个 URL 请求都会导致检查这是否来自有效会话 - 如果不是,则将它们发送到登录页面,否则正常处理。如果用户已经有一个活动会话,我们不会向他们显示登录页面,而是将他们带到预定义的主页。
我在谷歌上搜索了与它相关的东西,知道它会通过@Before
在控制器中使用注释来完成,但不知道如何@Before
工作以及如何使用?我正在使用播放 1.2.5。
我希望在将用户发送到登录之前检查会话 - 每个 URL 请求都会导致检查这是否来自有效会话 - 如果不是,则将它们发送到登录页面,否则正常处理。如果用户已经有一个活动会话,我们不会向他们显示登录页面,而是将他们带到预定义的主页。
我在谷歌上搜索了与它相关的东西,知道它会通过@Before
在控制器中使用注释来完成,但不知道如何@Before
工作以及如何使用?我正在使用播放 1.2.5。
您可以通过这种方式使用@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 中的论坛应用示例。
Play 安全模块开箱即用。它被大多数应用程序使用,并且还与不同的插件集成。在此处查看文档。
如果您仍然想自己实现它,您可以使用安全代码作为示例。
否则,@Before可以用于您的任何控制器静态方法,并且可以访问所有范围对象,包括会话。