【发布时间】:2014-11-18 20:50:41
【问题描述】:
我正在开发一个服务器控件,以避免在 Java 服务器端重复处理相同的请求类型。 主要目标是避免用户通过重复单击硬处理请求来淹没我的服务器处理器。 我正在开发一个 Servlet 过滤器来控制请求流,但如果有一个仍在处理的先前请求,我可以通过返回 HTTP 204 状态来“中止”第二个请求。 从服务器的角度来看,是可以的。但是网络浏览器只会处理那个“中止”的请求,而不是第一个。
Browser sends request "A"
Server starts to process the request "A"
Browser sends request "B"
Server aborts request "B" (HTTP 204)
Browser receives response "B" (Aborted)
Server finishes the request "A"
Browser does not displays / receives the request "A"
所以,最后是问题。 是否可以更改请求的响应? 这样就可以避免服务器端的重复处理,浏览器可以显示请求的内容。
您能否提出另一种解决该问题的方法?
Browser sends request "A"
Server start processing request "A"
Browser sends request "B"
Server "holds" request "B"
Server finishes the request "A"
Server forwards the request "B" to the the response "A"
Server aborts the request "A" (http 204)
Browser displays / receives the request "B" with the response "A" content / headers
提前致谢。
【问题讨论】:
-
我会使用大气或其他一些 websocket 框架。
-
你好@eduyayo,我同意你的观点,但我正在寻找一种不意味着对现有代码进行大规模重新设计的方法。
-
mh... 然后你必须在会话中保持“活动”一个工作线程并继续输入它。在 struts2 struts.apache.org/release/2.0.x/struts2-core/apidocs/org/apache/… 中做了类似的事情,但你必须将逻辑扩展到当cient再次打电话检查是否完成时继续喂食
-
你好@eduyayo。这很有趣。我正在考虑一个临时上下文来存储第一个响应,然后第二个请求可以直接从这个临时上下文中获取内容。
-
请注意,您可能会在会话中用东西阻塞服务器......必须仔细计划一下
标签: java http servlets request response