ASP Response
Response 的 Write / Redirect / End / Buffer / ContentType / Cookies 等成员。
常用成员
| Member | Purpose |
|---|---|
Write | 输出字符串到响应体 |
BinaryWrite | 输出图片、文件 |
Redirect | 302 跳转 |
End | 立即停止执行并输出缓冲区 |
Flush | 把缓冲区发给浏览器 |
Buffer | True 时先缓存再发 |
ContentType | text/html、application/json |
Charset | UTF-8 |
Status | 404 Not Found |
AddHeader | 自定义响应头 |
Cookies | 写 Cookie |
CacheControl | no-cache 禁缓存 |
Write 与输出
<%
Response.Write "第一行<br>"
Response.Write "第二行<br>"
Response.Write "拼接:" & (1 + 2) & "<br>"
%>第一行
第二行
拼接:3Redirect
<%
If Session("uid") = "" Then
Response.Redirect "login.asp"
End If
%>Redirect ends the page immediately (it calls End internally). If output already went out with Buffer = False, headers are on the wire and the redirect fails with "HTTP headers already sent".
Buffer 与 End
<% Response.Buffer = True %>
<%
' 先判断,再决定要不要输出
If Request("id") = "" Then
Response.Status = "400 Bad Request"
Response.Write "缺少 id"
Response.End
End If
' 正常输出
Response.Write "处理 id=" & Request("id")
%>With Buffer = True output collects in a buffer until the page ends or Flush is called, which makes "output then decide to redirect" possible — the buffer can be discarded.
Response.Buffer must be set before any output, including HTML and blank lines. That is why it goes on the first line as a directive attribute; setting it mid-page has no effect.输出 JSON
<%
Response.ContentType = "application/json"
Response.Charset = "UTF-8"
Response.Write "{""ok"":true,""name"":""" & Server.HTMLEncode(Request("name")) & """}"
%>{"ok":true,"name":"Ada"}VBScript escapes quotes by doubling them, so hand-built JSON becomes a thicket of "". For anything non-trivial write a JsonEncode helper or use a JSON library.
缓存控制
<%
Response.CacheControl = "no-cache"
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
%>Pages with personal data must disable caching, or pressing Back after logout reveals the previous user's content — a classic privacy incident.
文件下载
<%
Dim fname
fname = "report.csv"
Response.ContentType = "application/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=" & fname
Dim stream
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = 1 ' 二进制
stream.Open
stream.LoadFromFile Server.MapPath("/data/" & fname)
Response.BinaryWrite stream.Read
stream.Close
Set stream = Nothing
Response.End
%>A download page must emit nothing extra: tags, blank lines and BOMs all corrupt the file. The page does exactly one thing — write bytes.
常用成员
| 成员 | 用途 |
|---|---|
| 写输出 | 输出字符串到响应体 |
| 写二进制 | 输出图片、文件 |
| 重定向 | 302 跳转 |
| 结束 | 立即停止执行并输出缓冲区 |
| 刷新 | 把缓冲区发给浏览器 |
| 缓冲开关 | True 时先缓存再发 |
| 内容类型 | text/html、application/json |
| 字符集 | UTF-8 |
| 状态码 | 404 Not Found |
| 加头 | 自定义响应头 |
| Cookie | 写 Cookie |
| 缓存 | no-cache 禁缓存 |
Write 与输出
<%
Response.Write "第一行<br>"
Response.Write "第二行<br>"
Response.Write "拼接:" & (1 + 2) & "<br>"
%>第一行
第二行
拼接:3Redirect
<%
If Session("uid") = "" Then
Response.Redirect "login.asp"
End If
%>Redirect 会立即结束当前页——它内部调用了 End。但如果之前已经有输出且 Buffer = False,响应头已经发出去了,重定向就会失败并报「HTTP 头已发送」。
Buffer 与 End
<% Response.Buffer = True %>
<%
' 先判断,再决定要不要输出
If Request("id") = "" Then
Response.Status = "400 Bad Request"
Response.Write "缺少 id"
Response.End
End If
' 正常输出
Response.Write "处理 id=" & Request("id")
%>Buffer = True 时,输出先进缓冲区,直到页面结束或 Flush 才真正发出。这让「先输出一部分再决定重定向」成为可能——缓冲区可以丢弃。
Response.Buffer 必须在任何输出之前设置,包括 HTML 和空行。所以它通常写成文件第一行的 <%@ %> 属性,或紧跟其后。写在 HTML 中间等于没写。输出 JSON
<%
Response.ContentType = "application/json"
Response.Charset = "UTF-8"
Response.Write "{""ok"":true,""name"":""" & Server.HTMLEncode(Request("name")) & """}"
%>{"ok":true,"name":"Ada"}VBScript 里双引号要用两个双引号转义,拼 JSON 会变成一堆 "",很容易漏。数据复杂时建议手写一个 JsonEncode 函数,或直接用 ScriptControl 里的 JSON 库。
缓存控制
<%
Response.CacheControl = "no-cache"
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
%>涉及个人数据的页面必须禁缓存,否则用户登出后按「后退」还能看到上一个人的内容——这是很典型的隐私事故。
文件下载
<%
Dim fname
fname = "report.csv"
Response.ContentType = "application/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=" & fname
Dim stream
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = 1 ' 二进制
stream.Open
stream.LoadFromFile Server.MapPath("/data/" & fname)
Response.BinaryWrite stream.Read
stream.Close
Set stream = Nothing
Response.End
%>下载页里不能有任何多余输出——HTML 标签、空行、BOM 都会混进文件内容,导致下载下来打不开。整页只做一件事:写字节。