使用 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 服务进行服务器推送
markdown 使用Hibernate和MariaDB开发Jersey(Restful Web)应用程序