ASP.NET - Redirecionando páginas


Neste artigo vou falar sobre como podemos fazer o redirecionamento de páginas em ASP.NET usando Response.Redirect e Server.Transfer.

Como exemplo vou usar uma página simples de Login onde o usuário deverá informar o nome e a senha. Se o nome e a senha estiverem cadastrados irei redirecionar a o usuário para a página Bemvindo.aspx caso contrário retornarei para a página de Login : Login.aspx.

Os dados estão na tabela Usuarios no banco de dados Acesso.mdb que esta na pasta dados dentro da pasta Admin que é o local onde estão as páginas Login.aspx e Bemvindo.aspx

O código completo da pagina Login.aspx é dado a seguir:

<%@ Page Language="VB" %>
<%@ import Namespace="System.Web.Security" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

Sub btnLogin_OnClick(Source As Object, E As EventArgs)

Dim strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Server.MapPath("dados/Acesso.mdb")
Dim Conn As OleDbConnection = New OleDbConnection(strConn)

Dim strConsulta As String = "SELECT Nome FROM Usuarios WHERE Login = @Login AND Senha = @Senha"

Dim cmd As OleDbCommand = New OleDbCommand(strConsulta, Conn)
Dim objDR as OleDbDataReader

With Cmd.Parameters
   .Add(New OleDBParameter("@Login", txtLogin.text))
   .Add(New OleDbParameter("@Senha", txtSenha.text))
End With

try
  Conn.Open()
  objDR=Cmd.ExecuteReader(system.data.CommandBehavior.CloseConnection)

if objDR.HasRows then
     Server.Transfer("Bemvindo.aspx")
else
     Response.Redirect("Login.aspx")
End If

Catch ex As Exception
   me.lblMensagem.text = "Erro de acesso aos dados"
  Me.lblMensagem.Visible = True
End Try

End Sub

</script>
 
<html>
<head>
</head>
<body>
<div align="center">
<form runat="server">
<p align="center">
<img style="WIDTH: 258px; HEIGHT: 45px" height="32" src="maco1b.gif" width="233" border="0" />
</p>
<hr />
<table align="center" border="0">
<tbody>
<tr><td>Login </td><td>
<asp:TextBox id="txtLogin" runat="server" Width="163px"></asp:TextBox>
</td></tr><tr><td>Senha </td><td>
<asp:TextBox id="txtSenha" runat="server" Width="163px" Height="22px"></asp:TextBox>
</td></tr></tbody>
</table>
</div>
<div align="center">
</div>
<div align="center">
<asp:Button id="Button1" onclick="btnLogin_OnClick" runat="server" Text="Login"></asp:Button>
</div>
<div align="center">
</div>
<div align="center"><asp:Label id="lblmensagem" runat="server" visible="False"></asp:Label>
</div>
</form>
</body>
</html>
 

Funciona assim :

Quando o usuário informar o nome e a senha e clicar no botão Login o script será executado. Nele ocorre o seguinte n:

Dim strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Server.MapPath("dados/Acesso.mdb")
Dim Conn As OleDbConnection = New OleDbConnection(strConn)
 
-Defino a string de conexão e a seguir instancio um objeto Conn do tipo Connection
Dim strConsulta As String = "SELECT Nome FROM Usuarios WHERE Login = @Login AND Senha = @Senha"

Dim cmd As OleDbCommand = New OleDbCommand(strConsulta, Conn)
Dim objDR as OleDbDataReader
-Defino o comando SQL para selecionar o nome da tabela Usuário comparando o Login e a Senha com os valores informados

- Declaro um objeto Command
e um objeto do tipo DataReader

With Cmd.Parameters
   .Add(New OleDBParameter("@Login", txtLogin.text))
   .Add(New OleDbParameter("@Senha", txtSenha.text))
End With
 
Atribuo os parâmetros conforme os valores informados pelo usuário nos campos do formulário
 Conn.Open()
  objDR=Cmd.ExecuteReader(system.data.CommandBehavior.CloseConnection)
Abro a conexão e executo o Command
if objDR.HasRows then
     Server.Transfer("Bemvindo.aspx")
else
     Response.Redirect("Login.aspx")
End If
Se encontrou o Nome então há linhas no DataReader e então o login foi efetuado com sucesso. Caso contrário o login deve ser feito tentado novamente pois não houve retorno de linhas no DataReader.

Talvez esta não seja a melhor forma de você criar uma estrutura de segurança mas eu usei este exemplo apenas para falar de dois comandos usados aqui:

O que eles fazem e qual a diferença ?

Response.Redirect simplesmente envia uma mensagem ao Navegador dizendo a ele para mover-se para outra página.

Server.Transfer também envia o usuário para outra página mas ele tem algumas particularidades.

Ao transferir o usuário para outra página usando Server.Transfer o servidor conserva os recursos já usados. O invés de dizer simplesmente para o Browser redirecionar para outra página ele apenas altera o 'foco' no servidor e transfere a requisição.  Isto significa que você não esta criando novas requisições e sua aplicação fica mais rápida.

Mas nem tudo são flores ao usar Server.Transfer , pois  o processo de transferência pode operar somente em sites que estão rodando no servidor. Você não pode usar Server.Transfer para enviar o usuário para uma página externa ao servidor. Somente Response.Redirect pode fazer isto.

Além disto Server.Transfer mantém a URL original no Browser o que pode ajudar para entrada de dados mas causar confusão na depuração.

Server.Transfer possui um segundo parâmetro : preserveForm. Se você definí-lo como True  assim : Server.Transfer("Login.aspx", True) a consulta existente e qualquer variável de formulário ficará disponível para a página para a qual você esta fazendo a transferência.

Então finalizando podemos concluir que Response.Redirect faz o Browser visitar outra página e Server.Transfer ajuda a reduzir as requisições ao servidor ,mantém a URL , permite a transferência de consultas e variáveis de formulário.

Nota: Server.Execute  executa uma página e retorna o resultado.

Até o próximo artigo ASP.NET ...


José Carlos Macoratti