曲径通幽论坛

标题: response.redirect 方法和 response.buffer 属性的关系 [打印本页]

作者: easy    时间: 2013-4-5 23:51
标题: response.redirect 方法和 response.buffer 属性的关系
response.redirect 方法的作用是跳转网页,它对 response.buffer属性有依赖关系,也就是说如果要在网页中使用 redirect 方法的话,就必须将 buffer 属性设置为 true 。

如果将 buffer 属性设置为 false 会发生什么情况?比如运行下面的代码:
<[email=%@LANGUAGE=]%@LANGUAGE="VBSCRIPT[/email]" CODEPAGE="65001" %>
<% response.buffer = true %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

<%

for i = 1 to 10
response.Write(i & " ")
if i = 5 then
  response.redirect("http://www.baidu.com")
end if
next
%>
</body>
</html>
此时会看到错误提示:
1 2 3 4 5
Response 对象 错误 'ASP 0156 : 80004005' HTTP 头错误
/asp/buf.asp,行 16已将 HTTP 头输出到客户端浏览器。任何对 HTTP 头的修改都必须在输出页内容之前进行。
在上面的代码中,我们使用了页面缓冲技术,也就是说输出的页面会先输出到缓冲区然后再输出来。

那么看代码里,在 i 值为 5 时,就用 redirec 方法将页面重定向到另外一个页面,此时服务器在 http header 里告诉客户端浏览器这一改变,主要是增加一个 Location : http://www.baidu.com ,由下图也能看到:[attach]1509[/attach]
这里,由于缓冲的缘故,页面还没有输出来,因此重定向是可以的。但是如果将 buffer 值改为 false,那么页面在 i 为 500 时,仍然在输出,有悖于“任何对 HTTP 头的修改都必须在输出页内容之前进行”,因此就会出错。

上面的演示是为了使问题看起来简单。实际上,如果 buffer 设置为 false ,那么 redirect 语句放在 <html> 里的任一个地方都会提示错误,如果将其放在 <html> 之外,比如头部,那重定向就是有效的---但这么做看上去真的显得多余且没什么必要。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2