使用Jersey的RESTful Web服务的会话管理

时间:2012-08-27 21:48:57

标签: spring hibernate rest spring-security jersey

我正在我的Android, iPhone应用和MySQL之间开发Restful Web Service using Jersey。我还使用Hibernate将数据映射到数据库。

我有一个sessionId(密钥)。用户登录系统时会生成它。

User课程中:

public Session daoCreateSession() {
    if (session == null) {
        session = new Session(this);
    } else {
        session.daoUpdate();
    }
    return session;
}

Session班级:

Session(User user) {
    this.key = UUID.randomUUID().toString();
    this.user = user;
    this.date = new Date();
}

void daoUpdate() {
    this.key = UUID.randomUUID().toString();
    this.date = new Date();
}

当用户成功登录系统时,我将此sessionId发送到移动应用客户端。然后,当我想根据登录用户从数据库中获取一些信息时,我会针对每个请求将此Session key检查为身份验证in the REST Services

例如,对于用户参与的项目列表,我使用client.GET(SERVER_ADDRESS/project/get/{SessionID})

不是client.GET(SERVER_ADDRESS/project/get/{username})

如果它不是有效的会话密钥,我将向客户端发送403禁止代码。 您还可以查看here

事情是我不确定我的做法。考虑到泽西岛和移动应用,你对这种方法的cons有什么看法?

我研究了Spring Security。如果Session key方法不好,我仍然不知道是否可以使用它。你能救我吗?

2 个答案:

答案 0 :(得分:6)

如果你想使用SessionId,它应该有一个验证时间,如下所示:

private static final int MINUTES = 90;

public boolean isValid() {
   return System.currentTimeMillis() - date.getTime() < 1000 * 60 * MINUTES;
}

我还建议你看一下Jersey security and session management

检查以下链接以获取Spring安全性: Spring Security with JerseySpring security application sample

同时查看Jersey rest API security

答案 1 :(得分:4)

这是一个已解决的问题 - 像Tomcat这样的servlet容器已经进行了会话管理,并且可以通过TCP广播或使用memcache等共享数据源将会话状态分发到集群中的其他容器。

我建议阅读已有的内容,而不是无意中重新发明轮子。此外,如果您的应用程序受到欢迎,这将成为一个令人难以置信的热桌表。您将如何清除旧的会话ID?