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

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

谢谢

更新

我有两台服务器。

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

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

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

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

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

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

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

有帮助吗?

解决方案

你可以使用 目的。

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

其他提示

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

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

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

参见这里的例子(同步方法)

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

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

我不确定您为什么要创建登录令牌。您的问题似乎暗示该令牌位于数据库中而不是内存中。如果是这样,同步和互斥体不会真正有帮助,您需要的是使用“选择更新”来锁定数据库记录。

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

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

  1. 创建一个唯一的会话 ID,例如 UUID sessionID = UUID.randomUUID();
  2. 开始交易
  3. 从数据库中删除与请求中的令牌相匹配的任何令牌,例如
    从令牌中删除,其中 TokenID = <请求的令牌>
  4. 获取受影响的行数
  5. 如果受影响的行计数恰好为 1,则令牌有效。创建一个会话,例如
    插入会话值(sessionUUID、用户 ID、登录时间,...)
  6. 提交交易

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top