El objeto Response tiene 8 propiedades, 1 colección y 8 métodos:
La propiedad Response.Buffer sirve para intervenir en el proceso de buffering. Si el valor de Buffer es True, el servidor enviará el contenido del buffer a la salida, pero si es False, el proceso de buffering no se realiza. Esto significa que no es posible cambiar la propiedad después de que el servidor haya enviado la respuesta. Si se quiere evitar el buffering, habrá que hacerlo antes de que éste comience, por lo que la instrucción deberá ser la primera de todas.
El valor por defecto de Buffer en ASP 2.0 es False. En la versión 3.0 es True, siempre que se realice una instalación nueva, si es una actualización, quedará con el valor antiguo, es decir, False.
Esto de los proxy está muy bien si hablamos de HTML estático, pero si hablamos de ASP dinámico, es decir, páginas que cada vez que son llamadas pueden tener un contenido diferente, pero con el problema de que siempre tienen el mismo nombre, que es precisamente, en función de lo que el proxy decide si servir de la cache o conectarnos con el servidor original, pueden ser un grave problema.
Imagina que tu aplicación tiene una página que muestra los datos de un cliente previamente identificado, por ejemplo su ficha personal con domicilio, teléfono, cuenta bancaria de cargo, etc. La página tiene como nombre, por ejemplo, cliente.asp. Un cliente hace un request solicitando la página después de identificarse. El servidor envia la página solicitada, y el proxy, cumpliendo con su función, guarda en cache una copia. Lo mismo hace el navegador de la máquina desde donde se hace el request, y supongamos también que esa máquina está en una sala pública de terminales muy concurrida. Si... se adivina un desastre. En efecto, el cliente ha terminado sus transacciones y se marcha. Otro cliente, que estaba esperando su turno, se sienta ante la misma máquina... y cómo no, se conecta a la misma aplicación. La primera pantalla no es peligrosa, ya que son instrucciones. La segunda, tampoco, es un formulario donde hay que escribir la identificación... pero la tercera es cliente.asp que muestra la ficha con los datos personales.
¿Qué va a ocurrir? Apenas han transcurrido unos segundos desde que el anterior cliente hizo el mismo request. Aunque hubiesen pasados minutos, la situación sería la misma. Las caches del navegador están configuradas para ser eliminadas cada dia (eso con suerte), la del proxi, lo mismo, y éste solamente hará una verificación de fechas para ver si el original ha cambiado o no, y no lo ha hecho. Por tanto la cosa está clara: al segundo cliente le aparecerá la ficha personal del primero, y sólo cuando pulse el botón "recargar" del navegador, forzará al navegador y al proxy a conectarle con el servidor, obteniendo sus datos correctos. Pero mientras, hemos dejado que nuestra aplicación muestre unos datos indebidamente, lo cual es muy grave.
Para evitar que el proxy copie en su cache las respuestas de nuestros ASP, se puede utilizar la propiedad Response.CacheControl . Hay otras dos propiedades: Response.Expires y Response.ExpiresAbsolute que controlan las caches, pero éstas lo hacen sobre las del navegador.
Si se escribe:
<% Response.CacheControl = "Public" %> SI guarda en cache del proxy (por defecto)
<% Response.CacheControl = "Private" %> NO guarda en cache del proxy
Por ejemplo, una cabecera HTTP normal contiene el siguiente string:
content-type: text/html
Y después de escribir
<% Response.Charset("MS_Windows") %>
Contendría:
content-type: text/html; charset = MS_Windows
Hay que tener en cuenta que como argumento se puede escribir cualquier cosa, y aunque no sea válido, ASP no emite ningún mensaje de error, simplemente no surtirá el efecto deseado.
Por ejemplo, el siguiente código poduce una hoja de cálculo Excel en el navegador, simpre que Excel esté instalado en la máquina del cliente, claro.
<% Response.ContentType = "application/vnd.ms-excel" %>
<HTML>
<HEAD><TITLE>PRUEBA</TITLE></HEAD>
<BODY>
<TABLE>
<TR><TD>Valor de la celda A1</TD>
<TD>Valor de la celda B1</TD>
</TR>
<TR><TD>Valor de la celda A2</TD>
<TD>Valor de la celda B2</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Si se escribe:
<% Response.Expires = 0 %>
Esto significa que la página expira inmediatamente después de su recepción y visualización en el navegador. Si en lugar de cero se escribe, por ejemplo, 2, significará que dos minutos después de haberse recibido, el navegador eliminará la página de su cache.
El tiempo de expiración en la cache del navegador, hay que usarlo con precaución, ya que si la página está destinada a ser impresa (por ejemplo es el resguardo de una operación realizada por el cliente) y ha expirado, el navegador no podrá enviarla a la impresora, y emitirá un mensaje de error diciendo que no hay datos que imprimir, incluso aunque en ese momento la página sea visible en la pantalla, pero no es de esa imagen de donde el navegador envia datos a la impresora, sino de su cache en disco. Esto significa que hay que pensar cuidadosamente que páginas terminarán siendo impresas y cuales no en el momento de utilizar esta propiedad.
Se escribe:
<% Response.Expires = #Feb 20, 2000 20:00:00# %>
Por ejemplo:
<%
Do until (PROCESOS ACTIVOS... OR Response.IsClientConnected=false)
'--- si el cliente sigue conectado, se hacen los procesos necesarios
'---Procesos terminados o conexión perdida. Se cierran las conexiones y se liberan recursos
'--Se abren conexiones a la DB y/o se preparan procesos.
...
...
'--Mediante un bucle se verifica si el cliente sigue conectado, o si los procesos han terminado
...
...
Loop
...
...
%>
Si se desea impedir el acceso a la aplicación a una máquina cuyo IP sea, por ejemplo, 125.125.125.125 escribiremos:
<%
Dir_IP = Request.ServerVariables("REMOTE_ADDR")
If Dir_IP = "125.125.125.125" Then
Response.Status = "403 Acceso prohibido"
Response.Write Response.Status
Response.End
End If
%>
<HTML>
<HEAD><TITLE>PRUEBA</TITLE></HEAD>
<BODY>
..
..
Esto mismo se puede configurar en el servidor de forma fija, en el apartado de seguridad de la aplicación.
También tiene dos argumentos opcionales: Atributo, que puede consistir en cinco parámetros preestablecidos diferentes, y clave, que como su nombre indica, es la clave que se le asigna al atributo Valor
Los parámetros preestablecidos de Atributo pueden ser los siguientes:
<%@ LANGUAGE="VBScript" %> <% Response.Cookies("test").Expires = "31/05/05" Response.Cookies("test")("item1") = "prueba" Response.Cookies("test")("Contador") = Request.Cookies("test")("Contador") + 1 %> <HTML> <HEAD><TITLE>pruebas cookies</TITLE></HEAD> <BODY> Contador: <% = Request.Cookies("test")("Contador") %><BR> Cookie: <% = Request.Cookies("test") %> </BODY> </HTML>Y este sería el resultado:
Contador: 1
Cookie: CONTADOR=1&ITEM1=prueba
En este ejemplo, Contador se incrementa en 1 cada vez que la página es cargada por el navegador. La primera vez valdrá 1, la segunda 2, etc. Cuando el cookie no existe o haya expirado, el contador vuelve a 1 en la siguiente visita.
Recuerda que todas las instrucciones para crear o modificar los cookies hay que escribirlas siempre antes de cualquier otra cosa de la página. Otra cosa importante que no hay que olvidar es que nunca deben ponerse datos confidenciales en los cookies, ya que los ficheros se quedarán en la máquina del cliente, incluso después de haber expirado, y otro usuario podría llegar a ellos.
En los cookies se pueden guardar datos muy variados, como contadores, preferencias del cliente, colores, resoluciones, etc., y no se deben utilizar de forma maliciosa (spiware), pero recuerda que son datos que afectan solamente a una máquina física, y que los datos de un usuario no estarán disponibles si se conecta desde otra máquina.
Cada navegador genera y guarda los cookies de una manera diferente. Los del Internet Explores de Microsoft suelen estar en C:\WINDOWS\Cookies (Win95, 98 y ME). Si se trata de Win NT, 2000, 2003 o XP estarán en C:\Documents and Settings\nombre_usuario\Cookies.
Se escribe:
<%
Response.AddHeader "MiCabecera", "PRUEBA"
%>
Por ejemplo:
<%
Response.AppendToLog("Mi comentario")
%>
Y este sería el string añadido en un registro típico del fichero de logs del IIS:
125.125.125.125, - , 05/27/99, 9:50:00, W3SVC, PRUEBAS, 125.125.125.125, Mi comentario
Supongamos que tenemos el siguiente formulario HTML con tres campos:
'---Fichero formulario.htm
<HTML><HEAD> <TITLE>Prueba1 ASP</TITLE> </HEAD>
<BODY>
<FORM ACTION="prueba2.asp" METHOD="POST">
Nombre:<INPUT TYPE="text" NAME="Nombre" VALUE="Juan" ><br>
Ciudad:<INPUT TYPE="text" NAME="Ciudad" VALUE="Guadalajara" ><br>
Postal:<INPUT TYPE="text" NAME="Postal" VALUE="12345" ><br>
<INPUT TYPE="Submit" NAME="Boton" VALUE="Enviar">
</FORM>
</BODY>
</HTML>
Para poder ver el nombre de los campos y sus contenidos se escribe lo siguiente:
'---Fichero prueba2.asp
<%
bytecount = Request.TotalBytes
binread = Request.BinaryRead(bytecount)
Response.BinaryWrite binread
%>
Y este sería el resultado:
Nombre=Juan&Ciudad=Guadalajara&Postal=12345&Boton=Enviar
Se escribe:
<%
Response.Clear
%>
Por ejemplo, si se escribe:
<%
Response.Write "Primer string"
Response.End
Response.Write "Segundo string"
%>
Sólo se obtiene en la respuesta:
Primer string
Se escribe:
<%
Response.Flush
%>
He aquí un ejemplo de uso:
'---Fichero1.asp
'---Fichero2.asp
<% Response.Buffer = true %>
<HTML>
<BODY>
<%
Response.Write "Este es Fichero1.asp y se conmuta con Fichero2.asp"
Response.Clear
Response.Redirect "Fichero2.asp"
Response.Write "Esto ya no se procesa"
%>
</BODY>
</HTML>
<HTML>
<BODY>
<%
Response.Write "Este es Fichero2.asp"
%>
</BODY>
</HTML>
Este sería el resultado: se muestra parte de Fichero1 y el navegador es obligado a cargar Fichero2:
'---Fichero1.asp
Este es Fichero1.asp y se conmuta con Fichero2.asp
'---Fichero2.asp
Este es Fichero2.asp
Se escribe:
<%
Response.Write(Valores)
%>