java - 如何处理 Play Framework 中的 session 超时或过期?

标签 java playframework playframework-2.0 playframework-2.2

我想知道用户的 session 在服务器端是否已过期并在发生时执行某些操作。我该怎么做?

我正在使用 Java 和 Play 框架 2.2.1。

最佳答案

使用 Play 时的 built-in authentication ,在每个经过身份验证的请求中,在 session 中存储一个时间戳,并更新过期时间。

然后,在身份 validator 中,验证 session 过期时间。

文章How to implement a Session Timeout in Play Framework 2提供了这个例子:

public class Secured extends Security.Authenticator {

    public static final String UNAUTHENTICATED = "unauthenticated";

    public static User getLoggedInUser() {
        if (session("userId") == null)
            return null;
        return User.findById(Long.parseLong(session("userId")));
    }

    public static String getLoggedInUsername() {
        if (session("userId") == null)
            return null;
        return User.findById(Long.parseLong(session("userId"))).getUsername();
    }


    @Override
    public String getUsername(Http.Context ctx) {

        // see if user is logged in
        if (session("userId") == null)
            return null;

        // see if the session is expired
        String previousTick = session("userTime");
        if (previousTick != null && !previousTick.equals("")) {
            long previousT = Long.valueOf(previousTick);
            long currentT = new Date().getTime();
            long timeout = Long.valueOf(Play.application().configuration().getString("sessionTimeout")) * 1000 * 60;
            if ((currentT - previousT) > timeout) {
                // session expired
                session().clear();
                return null;
            } 
        }

        // update time in session
        String tickString = Long.toString(new Date().getTime());
        session("userTime", tickString);

        return User.findById(Long.parseLong(session("userId"))).getUsername();
    }
}

这需要应用程序配置文件 (application.conf) 中的 sessionTimeout 值(以分钟为单位)。

关于java - 如何处理 Play Framework 中的 session 超时或过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283418/

相关文章:

java - 读取 .txt 文件并卡在第一个字符上

javascript - 下载文件时在 Play Framework 中获取操作未找到错误?

html - 在 Play 2.3.x 中生成数据库表的 <table>

playframework - 在 Global.java 中未调用覆盖的 onHandlerNotFound

java - System.out.println 不打印输出

java - 执行 JPQL 查询的工具?

java - 是否可以在 gradle 中为 JavaCompile 启用 -Werror?

json - 在 Play2 scala 应用程序中执行 json 读取和写入时如何排除值

java - 如何提取部分路径并将其作为参数传递给 java 中 Play Framework 中的所有操作?

java - 如何在 play 2.6.x 中获得代码覆盖率