.Net 会话,如何获取数据
.Net session , how to get data
我有一个名为 login.aspx 的登录页面,它将 affid 复制到会话中并在另一个名为 dashboard.aspx 的页面上加载 affid。
我收集会话并像这样加载它:
Login.aspx :
MysqlConn.Open()
Dim Query As String
Query = "select * from mdxmain.taffiliate where affID = '" & username.Text & "' and affPassword = '" & password.Text & "'"
COMMAND = New MySqlCommand(Query, MysqlConn)
Session("affID") = username.Text
dashboard.aspx :
Dim userid As String = HttpContext.Current.Session("affID")
If (userid Is Nothing) Then
Response.Redirect("login.aspx")
End If
Dim c As New MySqlConnection("Server=test;Database=test;UID=test;PWD=test;")
c.Open()
Dim com As New MySqlCommand("SELECT AffID FROM toutcome WHERE affID = '" & CType(Session.Item("affID"), String) & "'", c)
Dim myReader As MySqlDataReader = com.ExecuteReader(CommandBehavior.CloseConnection)
myReader.Read()
affiliateid.Text = myReader.Item(0).ToString()
myReader.Close()
问题是它只从数据库中收集 "affid",而且我有多个我想使用的字段。我如何加载所有的 feilds 以便我可以使用它们?所以在 mysql 查询中,我想根据会话中的数据搜索字段。
在类似的场景中,我为我的对象创建了一个 class...在这种情况下,我将其称为 User
用户 class 将具有多个属性,例如名称、访问权限等。
class 填充在 login.aspx 代码中并分配给会话。
所有需要检查用户凭据的后续页面将具有以下内容
Private CurrentUser as New User
Protected Sub PageLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PageLoad
If IsNothing(Session("USER")) Then
Response.Redirect("Login.aspx")
Else
CurrentUser = Session("USER")
End If
End Sub
然后您可以使用 CurrentUser.NameOfProperty
访问任何用户详细信息,例如CurrentUser.Name
或 CurrentUser.AccessRights
等等
ASP.Net 会话可以保存任何可序列化的信息,因此如前所述,您可以根据需要在其中存储整个对象,并根据需要检索字段。
话虽如此,我还是要提醒大家不要在会话中存储过多的敏感信息(如密码),因为这样做通常是一种反模式。
我们使用从 HTTPContext 初始化的会话使用包装器对象,并确保我们永远不会在我们的子对象中传入或使用任何 Web 特定代码,同时仍然允许会话的整体概念。
所以像这样:
Public Class UserSession
Public Property UserName as String = String.Empty
Public Sub New(context as HTTPContext)
...
Me.Username = CStr(context.Session("UserName"))
End Sub
Public Sub Synchronize(context As HTTPContext)
....
context.Session("UserName") = Me.Username
End Sub
End Class
在登录时,您现在可以将其更改为:
Dim us = New UserSession(HttpContext.Current)
MysqlConn.Open()
Dim Query As String
Query = "select * from mdxmain.taffiliate where affID = '" & username.Text & "' and affPassword = '" & password.Text & "'"
COMMAND = New MySqlCommand(Query, MysqlConn)
us.UserName = username.Text
... Set any other properties you need ...
us.Synchronize(HttpContext.Current)
然后在页面上你可以这样做:
Dim us = New UserSession(HttpContext.Current)
DoStuff(us.UserName)
编辑:
我刚刚意识到我并没有真正向您提供最初如何设置属性的详细信息。您可以通过以下两种方式之一进行操作。
一个是完全按照您在示例中的方式进行 (Session("SomeKey") = "SomeValue") 由于独特的登录过程,这实际上是我们管理我们的方式。本质上,对象原样是只读的,因为不会保留任何更改(这就是我们想要的方式),但这可能不是对每个人都是最好的。
如果您想要随时更改值,可能更好的方法是实施 "Synchronize" 方法将属性存储回会话。这将处理初始加载,以及事后的任何更改。
如果您不想执行额外步骤,也可以直接在会话中支持属性。
参见上面编辑的方法。
我有一个名为 login.aspx 的登录页面,它将 affid 复制到会话中并在另一个名为 dashboard.aspx 的页面上加载 affid。
我收集会话并像这样加载它:
Login.aspx :
MysqlConn.Open()
Dim Query As String
Query = "select * from mdxmain.taffiliate where affID = '" & username.Text & "' and affPassword = '" & password.Text & "'"
COMMAND = New MySqlCommand(Query, MysqlConn)
Session("affID") = username.Text
dashboard.aspx :
Dim userid As String = HttpContext.Current.Session("affID")
If (userid Is Nothing) Then
Response.Redirect("login.aspx")
End If
Dim c As New MySqlConnection("Server=test;Database=test;UID=test;PWD=test;")
c.Open()
Dim com As New MySqlCommand("SELECT AffID FROM toutcome WHERE affID = '" & CType(Session.Item("affID"), String) & "'", c)
Dim myReader As MySqlDataReader = com.ExecuteReader(CommandBehavior.CloseConnection)
myReader.Read()
affiliateid.Text = myReader.Item(0).ToString()
myReader.Close()
问题是它只从数据库中收集 "affid",而且我有多个我想使用的字段。我如何加载所有的 feilds 以便我可以使用它们?所以在 mysql 查询中,我想根据会话中的数据搜索字段。
在类似的场景中,我为我的对象创建了一个 class...在这种情况下,我将其称为 User
用户 class 将具有多个属性,例如名称、访问权限等。
class 填充在 login.aspx 代码中并分配给会话。
所有需要检查用户凭据的后续页面将具有以下内容
Private CurrentUser as New User
Protected Sub PageLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PageLoad
If IsNothing(Session("USER")) Then
Response.Redirect("Login.aspx")
Else
CurrentUser = Session("USER")
End If
End Sub
然后您可以使用 CurrentUser.NameOfProperty
访问任何用户详细信息,例如CurrentUser.Name
或 CurrentUser.AccessRights
等等
ASP.Net 会话可以保存任何可序列化的信息,因此如前所述,您可以根据需要在其中存储整个对象,并根据需要检索字段。
话虽如此,我还是要提醒大家不要在会话中存储过多的敏感信息(如密码),因为这样做通常是一种反模式。
我们使用从 HTTPContext 初始化的会话使用包装器对象,并确保我们永远不会在我们的子对象中传入或使用任何 Web 特定代码,同时仍然允许会话的整体概念。
所以像这样:
Public Class UserSession
Public Property UserName as String = String.Empty
Public Sub New(context as HTTPContext)
...
Me.Username = CStr(context.Session("UserName"))
End Sub
Public Sub Synchronize(context As HTTPContext)
....
context.Session("UserName") = Me.Username
End Sub
End Class
在登录时,您现在可以将其更改为:
Dim us = New UserSession(HttpContext.Current)
MysqlConn.Open()
Dim Query As String
Query = "select * from mdxmain.taffiliate where affID = '" & username.Text & "' and affPassword = '" & password.Text & "'"
COMMAND = New MySqlCommand(Query, MysqlConn)
us.UserName = username.Text
... Set any other properties you need ...
us.Synchronize(HttpContext.Current)
然后在页面上你可以这样做:
Dim us = New UserSession(HttpContext.Current)
DoStuff(us.UserName)
编辑: 我刚刚意识到我并没有真正向您提供最初如何设置属性的详细信息。您可以通过以下两种方式之一进行操作。
一个是完全按照您在示例中的方式进行 (Session("SomeKey") = "SomeValue") 由于独特的登录过程,这实际上是我们管理我们的方式。本质上,对象原样是只读的,因为不会保留任何更改(这就是我们想要的方式),但这可能不是对每个人都是最好的。
如果您想要随时更改值,可能更好的方法是实施 "Synchronize" 方法将属性存储回会话。这将处理初始加载,以及事后的任何更改。
如果您不想执行额外步骤,也可以直接在会话中支持属性。
参见上面编辑的方法。