Web services 如何防止对网页的多次访问?

Web services 如何防止对网页的多次访问?,web-services,mutual-exclusion,Web Services,Mutual Exclusion,假设我有一个web服务,我只想提供一次内容。服务完成后,对该url的任何其他访问都会生成错误消息 我该怎么做这样的事情呢?如果两个客户端同时访问url会怎么样?我会使用数据库来管理内容服务。您可以使用事务获取内容并将其设置为在一个步骤中检索,这将防止两个客户端同时访问服务的问题。您的要求与我的服务器缓存动态报告的情况非常相似,但相反。 我有按需生成的统计报告,这需要很长时间,因此,如果有人已经请求了该页面,那么缓存的页面将得到服务,而不是重新生成它 你的情况是,一旦一页送达,就不要再送达 无论哪

假设我有一个web服务,我只想提供一次内容。服务完成后,对该url的任何其他访问都会生成错误消息


我该怎么做这样的事情呢?如果两个客户端同时访问url会怎么样?

我会使用数据库来管理内容服务。您可以使用事务获取内容并将其设置为在一个步骤中检索,这将防止两个客户端同时访问服务的问题。

您的要求与我的服务器缓存动态报告的情况非常相似,但相反。 我有按需生成的统计报告,这需要很长时间,因此,如果有人已经请求了该页面,那么缓存的页面将得到服务,而不是重新生成它

你的情况是,一旦一页送达,就不要再送达

无论哪种方式,我们都需要在每个页面上有一个持久的标志或签名。该标志或签名必须位于持久数据存储上

管理无数可能的页面 如果您必须像我一样管理无数个页面,那么由于按需http参数驱动的动态页面的数量可能是无限多的,因此您不能有简单的单一持久性标志。我有一个例程将http post/get请求参数压缩成一个唯一的签名。该签名被保留。因此,当请求传入时,http参数将通过该签名生成器运行,并将生成的签名与持久性数据存储进行比较,以搜索签名是否已经存在

在我的例子中,如果签名存在,我将为缓存的页面提供服务。在您的情况下,如果签名存在,您将显示一个错误页面

先到先得受时间事件影响 然而,在这两种情况下,“第一次服务的页面”都会受到时间事件的影响。在我的例子中,当上传新数据时,该签名已过时。因此,我必须确保我的统计信息模式是基于时间的——数据加载时间或事件发生时间。因此签名有两个组件,http参数签名和请求实体的事件/加载时间。如果签名匹配,但数据库中存储的请求实体的最新时间大于签名中保留的时间,则表示该请求被视为“新页面”

您必须自行决定如何设计http参数,以帮助您生成尽可能短的签名,并决定哪些参数将使页面唯一

至于持久化存储,因为我已经在使用oracle存储统计信息,所以我还使用了相同的oracle数据库来持久化签名。否则,我认为hsqldb可能是一个好的解决方案

签名策略 签名表将由三个字段组成:EventDateTime、ownersemaphore、unique key paramsig

其中,为了防止表超出当前签名的范围,在签名比较期间会覆盖过时的签名。我还负责删除过时的签名

多用户访问的管理非常简单,只需放置一个带有null datetime的paramsig。在我的例子中,我可以保证请求datetime是唯一的,因此我实际上使用了请求datetime作为ownersemaphore。第一个幸运的人(但在我的例子中是第一个需要等待未缓存报告的不幸用户)竞相到表并创建唯一的paramsig将导致数据库系统抛出后续尝试。null datetime表示保留了一个参数,将在以后填写。在您的情况下,您可能可以跳过这一步,只需使用paramsig,ownersemaphore

但是,如果您在多服务器环境中,则需要为ownersemaphore设计一个复合密钥,如服务器id+请求时间


我不确定hsqldb是否能够管理并发性。我只在oracle和sqlserver上执行过此策略。

您希望为每个客户机提供一次内容还是一次?你使用什么语言/技术?一次,语言不可知论者,我不想要代码,我想知道怎么做。