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

Posted

技术标签:

【中文标题】使用 Jersey 的 RESTful Web 服务的会话管理【英文标题】:Session management for a RESTful Web Service using Jersey 【发布时间】:2012-08-22 10:03:15 【问题描述】:

我正在我的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 在考虑泽西岛和移动应用程序的这种方法中? 我仍然不知道 Session key 方法对我来说是否是个好主意。

【问题讨论】:

这不是 RESTful。 SessionID 将发生变化,因此您的 URL 将引用资源。 为什么?我只用this approach 一个 URL 标识一个资源。你的资源是什么? 不,MySQL 是您的后端。在您的上下文中,项目和用户是资源。请阅读brief introduction to REST。 好的,谢谢,你是对的,但你已经知道你的问题的答案了:) 【参考方案1】:

如果你想使用 SessionId 那么它应该有一个验证时间,像这样:

private static final int MINUTES = 90;

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

【讨论】:

【参考方案2】:

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

我建议阅读已有的内容,而不是无意中重新发明***。此外,如果您的应用程序被证明很受欢迎,这将成为一个非常热门的表格。您将如何清除旧的会话 ID?

【讨论】:

用户每次登录系统都会生成一个新的会话ID,也是临时ID,过一段时间就过期了。 如果您期望高负载,那么每个请求都需要对同一个表进行操作会很糟糕。每次登录都需要写入,所有其他操作都需要读取无法有效索引的大表(UUID 对此不利),然后您需要一个后台线程来扫描表并删除过期的会话 ID ,否则表格将填满无用的数据。我真的强烈建议您考虑使用由code.google.com/p/memcached-session-manager 支持的 Tomcat 内置会话管理 他实际上是在为无会话请求创建一个令牌系统。

以上是关于使用 Jersey 的 RESTful Web 服务的会话管理的主要内容,如果未能解决你的问题,请参考以下文章

使用 jersey 与 RESTful Web 服务进行服务器推送

用jersey构建REST服务系列文章

用jersey构建REST服务系列文章

markdown 使用Hibernate和MariaDB开发Jersey(Restful Web)应用程序

使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

使用 Spring Security 和 Jersey Restful Web 服务进行登录身份验证