13. oktober 2005 - 22:37Der er
25 kommentarer og 1 løsning
redirect history -2
Hej Ex'er
Jeg har neogle sider der undersøger for login, og hvis de ikke er logget ind sendes de til logind siden, der ville jeg så gerne når de havde logget ind sende dem tilbage til den side de gerne ville se, men kan ikke få det til at virker med JS eller noget andet så jeg håber på hjælp her.
side 1 -> login_side -> log_ind_script ->retur til side 1
Når du godkender et login kan du tildele en variable session("Godkendt") = 1 Denne session kan du tjekke for i toppen af de sider du ønsker at kaste uønskede brugere væk fra. Sessions ligger på den server der afvikler sitet. Det kan være en fordel i global.asa at sætte levetiden til x antal minutter, alt efter hvor mange brugere du har på sitet.
e.g. i asp (VB): <% if session("Godkendt") <> 1 then response.redirect "badlogin.asp" %>
Du må forklare dig lidt nærmere. Det virker simpelt det du beskriver indledningsvis, men nu bliver jeg helt blank. Response hvad redirect write eller hvad. Og hvornår skal de 3 baglæns. Hvilken handling udfører de, eller mangler at udføre, som gør at de skal sendes baglæns?
Du skal bruge server.transfer i kombination med response.redirect. I pseudokode ser det således ud:
side1: check om bruger er logget ind (f.eks. aflæst i en session-variabel) hvis bruger ikke er logget ind, så server.transfer "loginside" ellers vis siden slut hvis slut side
loginside: check om det er et postback, dvs. brugeren har trykket loginknappen og sendt brugerinfo hvis det er postback, så check imod databasen om brugeren kan autoriseres hvis bruger kan autoriseres så sæt session-variabel som angiver at bruger er autoriseret sæt fejlbesked til tom ellers sæt evt. en fejlbesked slut hvis response.redirect request.servervariables("SCRIPT_NAME") & "?" & fejlbesked ellers vis loginformular med action sat til request.servervariables("SCRIPT_NAME") slut hvis slut side
Fejlbeskeden kan du bruge til at informere brugeren i loginformularen, hvis du synes det er nødvendigt (om ikke andet er det da en brugervenlig måde at håndtere brugeren :)).
Du skal ikke bruge history.back du skal bruge den struktur som du laver på serveren til at få brugeren tilbage til den side han/hun oprindelig surfede ind på...
Prøv lige at nærstuder en sekvens jeg har skrevet og bemærk specielt hvor jeg benytter Server.Transfer (som altså er en faktisk kommando i ASP) og hvor jeg bruger Response.Redirect (som du nok allerede kender). Server.Transfer gør at din URL ikke bliver skiftet fra du beder om side1 til du logger ind og er tilbage på side1...
Når din bruger logger ind, gemmer du vel information om at han er logget på i en session-variabel...? Jeg tillader mig at antage dette og at den session-variabel hedder "godkendt".
På de sider som skal være beskyttet af login sætte du i toppen denne kode (f.eks. side1.asp):
<% if isempty(session("godkendt")) then Server.Transfer "login.asp" end if %> <html> . <!-- indholdet af den side som er beskyttet --> . </html>
På din loginside (som jeg lige har lavet en demoversion af her) har du flg. kode:
<% if Request.Form("login") <> "" then ' åben database ' check om brugernavn og adgangskode passer sammen ' læg denne information i variables hasAccess
if hasAccess then session("godkendt") = true end if
' Smid brugeren omkring samme side igen ' Hvis brugerens login var korrekt vil siden nu blive vist ' ellers ender han bare på loginsiden igen... Response.Redirect Request.ServerVariables("SCRIPT_NAME") end if %> <html> <head> <title>Login</title> </head> <body> <form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="POST"> Brugernavn: <input type="text" name="username"><br> Adgangskode: <input type="password" name="password"><br> <input type="submit" name="login" value="Log på"><br> </form> </body> </html>
På de beskyttede sider er der følgende: <% If Session("login") <> "JA" Then Response.Redirect "../medlem.asp" End if %>
Loginsiden ser således ud: <form action="medlemmer/log_ind.asp"> <table cellspacing="1" cellpadding="1" border="0"> <tr> <td><font face="Verdana" size="2" color="#000080">Nummer:</td> <td><input type="text" name="medlemsnummer" size="10"></td> </tr> <tr> <td><font face="Verdana" size="2" color="#000080">Password:</td> <td><input type="password" name="password" size="10"></td> </tr> <tr> <td colspan="2" align="center" valign="bottom" height="30"><input type="submit" class="submit" Value=" Log ind "></td> </tr> </form> SOm jo sender folk til log_ind.asp
Den se således ud:
<%
dbConn = "PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("../../db/medlemmer.mdb") If isnumeric(request("medlemsnummer")) = false Then response.redirect "../medlem.asp?logind=false" End If
response.buffer=true Query = "Select * from medlemmer where id =" & request("medlemsnummer") Set strConn = Server.CreateObject("ADODB.Connection") strConn.Open dbConn Set rs = strConn.Execute(Query)
If rs.EOF then response.redirect "../medlem.asp?logind=false" End if
Do While Not rs.EOF
If not request("password") = rs("password") then response.redirect "../medlem.asp?logind=false" else
Ja, se er det jo bare at passe det ind i det kode jeg lige har vist dig (din login-knap skal have et navn for at det fungerer ordentligt, jeg har kaldt den login):
../medlem.asp: --------------------
<% response.buffer=true
if Request.Form("login") <> "" then ' åben database ' check om brugernavn og adgangskode passer sammen ' læg denne information i variables hasAccess dbConn = "PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & Server.MapPath("../../db/medlemmer.mdb")
strQuery = "SELECT * " & _ "FROM medlemmer " & _ "WHERE id =" & request.form("medlemsnummer") & _ " AND password = '" & request.form("password") & "'" Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open dbConn Set rs = objConn.Execute(strQuery)
If not rs.EOF then Session.Timeout = 60 Session("login") = "JA" Session("user") = rs("id") Session("fornavn") = rs("fornavn") Session("efternavn") = rs("efternavn") Session("email") = rs("email") Session("navn") = rs("fornavn") & " " & rs("efternavn") End if
rs.Close Set rs = Nothing objConn.Close set objConn = nothing
' Smid brugeren omkring samme side igen ' Hvis brugerens login var korrekt vil siden nu blive vist ' ellers ender han bare på loginsiden igen... Response.Redirect Request.ServerVariables("SCRIPT_NAME") end if %> <html> <head> <title>Login</title> </head> <body> <form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="POST"> <table cellspacing="1" cellpadding="1" border="0"> <tr> <td><font face="Verdana" size="2" color="#000080">Nummer:</td> <td><input type="text" name="medlemsnummer" size="10"></td> </tr> <tr> <td><font face="Verdana" size="2" color="#000080">Password:</td> <td><input type="password" name="password" size="10"></td> </tr> <tr> <td colspan="2" align="center" valign="bottom" height="30"> <input type="submit" class="submit" name="login" value=" Log ind "></td> </tr> </table> </form> </body> </html>
beskyttede sider ser således ud i toppen:
<% if session("login") <> "JA" then Server.Transfer "../medlem.asp" end if %>
Ja, jeg har samlet selve opslaget og loginformularen i en fil, fordi jeg synes de hører sammen, men det er ikke noget krav. Hvis du vil splitte dem op, skal du bare være opmærksom på hvordan du kalder dem.
Har du husket at ændre koden på de beskyttede sider? - den er jo en smule anderledes end din egen...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.