3

我有一个注册页面,它接收令牌广告解析它们并在参数适用时登录用户。

从我检查令牌到我从数据库中删除令牌的时间之间,另一个用户可以使用相同的令牌登录。有没有办法确保特定范围的代码行将不受干扰地执行,所以我不会有竞争条件问题?

谢谢

更新

我有两台服务器。

  1. 阿帕奇雄猫 6
  2. red5 v0.9(免费的基于java的flash媒体流和通信服务器)

我正在为 Facebook 编写游戏应用程序。

游戏本身是用 adobe flash builder 2 编写的。

游戏本身将使用 red5 服务器提供服务。问题是 red5 没有收到请求和响应标头,因此无法检索要使用的会话信息以从 facebook 获取信息。

为了解决用户连接到 tomcat 服务器的问题,该页面检查 facebook 相关信息的会话并使用 tinyFBClient 连接到 facebook,并将信息存储在 mysql db(用户详细信息)中,以确保这同一用户是要连接到 red5 的用户。

一旦创建了令牌。tomcat 页面显示一个对象 HTML 元素以显示相关的 SWF 文件(游戏文件)。tomcat 页面将令牌传递给该 SWF 文件。加载 SWF 文件后,它会获取该令牌并使用它连接到 red5 并查找用户信息。

我希望描述可以帮助您了解我的需求。感谢大家的支持!

4

5 回答 5

3

您可以同步代码块,这样一次只有一个线程可以执行它。但是,这似乎不是一个很好的解决方案,因为它会减慢您的应用程序。您希望多个用户同时登录。

令牌是如何创建的?如果您要在服务器端生成它们以响应用户登录,那么一个用户不应该能够使用另一个用户的令牌。

于 2010-02-08T14:28:53.647 回答
2

听起来你需要一个同步的方法/块:

例如,请参见此处(同步方法)

http://java.sun.com/docs/books/tutorial/essential/concurrency/syncmeth.html

小心别煮过头了!过多的同步会导致瓶颈!

于 2010-02-08T14:27:48.427 回答
2

您可以使用Lock对象。

与更原始的同步块和方法相比,使用 Lock 对象具有优势。

于 2010-02-08T14:28:21.657 回答
2

我不确定您为什么要为登录创建令牌。您的问题似乎暗示此令牌在数据库中而不是在内存中。如果是这样,同步和互斥锁将无济于事,您需要使用“选择更新”锁定数据库记录。

也许这会带来很多不相关的复杂性,但是为什么要创建一个令牌来进行登录呢?每当我登录时,我只需从屏幕或传入表单中收集用户 ID 和密码,检查数据库以查看组合是否有效,如果有效,则让用户进入。你需要令牌做什么?

于 2010-02-08T14:40:53.630 回答
1

您说您“从数据库中删除令牌”。数据库是 SQL 数据库吗?如果是这样,那么您可以使用事务来避免竞争条件。它看起来像这样:

  1. 创建一个唯一的会话 ID,例如UUID sessionID = UUID.randomUUID();
  2. 开始交易
  3. 从数据库中删除与请求中的令牌匹配的任何令牌,例如
    DELETE FROM Tokens WHERE TokenID = <requested-token>
  4. 获取受影响的行数
  5. 如果受影响的行数正好是 1,那么令牌是有效的。创建一个会话,例如
    INSERT INTO Session VALUES (sessionUUID, userID, loginTime, ...)
  6. 提交事务

现在,如果登录成功(即受影响的行数正好为 1),则向客户端发送一个包含会话 ID 的 cookie。

于 2010-02-08T15:14:04.140 回答