发送一些内容后重定向网页

时间:2016-02-24 22:29:42

标签: java html redirect webserver jasig

我正在使用一个Web框架(uPortal),它通过抛出异常然后挂起来处理错误。该框架通过将XML呈现为HTML来工作。当存在异常时,浏览器会将呈现的内容接收到失败的XML模板元素,然后浏览器就会等待超时。我们团队的理论是在错误发生之前发送内容,这让我感到惊讶。我使用过的其他框架似乎在发送内容之前完成了渲染。

我的问题是,有没有办法在内容发送后重定向浏览器?在这种情况下,我们正在渲染<script>标记的内容,但错误可能发生在html中的任何位置。

我目前唯一的想法是在页面顶部注入一些javascript,并尝试更改框架的行为以快速失败并关闭连接并添加</body>和{{1}发生错误时标记。然后上面提到的javascript将在pageload上运行并检测整个页面的内容是否在那里,如果没有则进行客户端重定向。也许它可以在页面底部寻找一个特殊的隐藏div。

是否有任何框架以不同方式解决此问题或使用类似框架解决此问题的人?

5 个答案:

答案 0 :(得分:1)

您必须捕获错误,或捕获缓冲区中的输出。如果您可以处理异常,则可以打印一个简单的脚本标记,如

<script> window.location.href = 'some_new_url';</script>

如果浏览器将doctype理解为与HTML相关的内容,则会执行该标记。

如果您可以捕获缓冲区中的输出,则在处理错误时,您可以决定将HTTP重定向发送到浏览器并销毁输出缓冲区。

对于其他frameowrks,在PHP中,您可以使用ob_start()启用输出缓冲,ob_start()在请求完全完成之前不会开始发送内容。

答案 1 :(得分:0)

我不知道该框架,但

在http中,每个响应都有一个与之关联的响应代码。由于页面已经中途传输/呈现,因此已经发送(和接收)了状态代码(通常是#34; 200&#34;)。

对于相同的响应,浏览器无法接受其他响应代码(例如&#34; 301&#34;用于重定向)!此外,服务器无法发送另一个响应代码,因为原始响应代码已经提交并发送到客户端。

您对http协议的错误和知识的描述意味着在使用的框架/服务器组件中可能存在一些实现错误,或者它已经完成了,冒着你现在所处的情况......

答案 2 :(得分:0)

要重定向页面,您需要在标头中设置重定向信息。但是一旦你开始写内容就可以写标题了(当你竞争整个文档的竞争时,可能已经收到了标题)

但是,你可以用以下不同的方式做到这一点

1.let document loading complete and record if you need to redirect the page while rendering
2. add a unique  request-id identifier for each page load
3. invoke ajax call with request-id ( may be rest call)  to server asking if page needs to be redirected.
4. if page needs to be redirected , do so, via javascript in browser at client end. 

答案 3 :(得分:0)

HTTP响应由标头和可选的响应内容组成。 一旦开始将响应写入套接字连接,就无法恢复它。在您的示例中:如果在内容生成过程中遇到错误,则无法添加重定向标题 - 标题部分已经写入。

上述陈述并非完全正确:在HTTP chunked transfer encoding中,响应以单独的块发送。最后一个块可以有一个包含entity-header字段的可选预告片,理论上是一个重定向头。但如果可以使用这些机制则是一个不同的问题。例如,servlet容器可能使用分块传输编码,但没有为您提供设置预告片的API。

但写作不能立即开始:例如HttpServletResponse维护响应内容的缓冲区。如果设置标题并开始编写内容,则只填充缓冲区,您仍然可以重置响应并从头开始。但是一旦缓冲区溢出,响应就会写入连接,HttpServletResponse现在已提交

这样的机制为您提供了在内容生成期间处理错误的方法,这些错误发生在尚未提交响应时:只需重置响应并发送错误消息。如果它支持这样的机制,您可以检查您的框架。但显然这不是更大响应的解决方案。

在内容生成期间避免错误的第二种方法只是确保它们不会发生。首先收集响应所需的所有数据(例如,进行不安全的数据库调用),然后在第二步生成响应 - 第二步现在应该失败(除非您的代码中有错误)

您已经提到了第三种处理错误的方法,让客户端清理响应并采取一些措施来检测错误(例如,通过在生成的HTML响应中包含脚本)。

答案 4 :(得分:0)

唯一可行的方法是创建一个缓存响应的代理HttpServletResponse对象。您需要为uPortal提供此代理而不是实际的HttpServletResponse,并且只有在处理完成时才使用实际响应发送输出/如果处理失败则使用发送重定向。

HTTP协议设计限制是一旦输出启动就无法发送HTTP重定向。

其他可能的方式依赖于HTML或Javascript重定向,但由于您认为错误可能随时发生,因此很难以浏览器可靠地将其解释为重定向的方式将其打印出来。