主動偵測另一Framework之Session是否Timeout或有異動
這篇是接續前一篇:不同Framework同步Session資料 這個 Scenario 衍生的 Case。
前一篇,我們已經可以在第一次啟動 Net2.0 的 Session (Session_Start) 時,從 Net1.1 的 Session 中,取得登入資訊、授權資料及其他一卡車執行應用程式所需要的資料。但是這些資料的有效期限,也就是 Session Timeout 時間,必須由 Net1.1 的 Session 來決定,而且如果有登出,再換另一個使用者登入,此時 Net2.0 的 Session 資料也要隨之更新。
整個 Scenario 最大的限制就是,不能去異動 Net1.1 的登入程式,所以一切要自立自強,處變不驚,泰山崩於前而不動聲色 (?)
從上述的需求描述和限制來看,我們可以推導出一個結論:只要存取 Net2.0 的頁面時,都要去比對 Net1.1 的 Session。這樣便可以解決此問題。
在我的專案中,所有 Net2.0 的頁面,都會繼承我們自行撰寫的 BasePage,所以就簡單囉:
BasePage.vb
Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
'每次都要去檢查和 1.1 的 Session 有沒有一致 (UserID 和 Authority)
If Not IsNothing(Session("UserID")) AndAlso Not IsNothing(Session("Authority")) Then
Dim sID As String = Session("UserID").ToString
Dim sAuthority As String = Session("Authority").ToString
Dim sLoginUrl As String = Me.GetLoginURL(False)
sLoginUrl = sLoginUrl.Replace("~", Me.Request.ApplicationPath).Replace("//", "/")
Dim sSyncLoginUrl As String = /SyncLoginInfo/P_TransferLogin.htm?url=" & Me.Request.RawUrl
Dim sbJS As New System.Text.StringBuilder
sbJS.Append("<script language='javascript' type='text/javascript'> " & vbCrLf)
sbJS.Append(" $(document).ready(function() { " & vbCrLf)
sbJS.Append(" $.ajax({ " & vbCrLf)
sbJS.Append(" type: 'post', " & vbCrLf)
sbJS.Append(" cache: false, " & vbCrLf)
sbJS.Append(" url: /SyncLoginInfo/P_VerifyLoginInfo.aspx', " & vbCrLf)
sbJS.Append(" data: {UserID: '" & sID & "' , Authority: '" & sAuthority & "' }, " & vbCrLf)
sbJS.Append(" error: function() { " & vbCrLf)
sbJS.Append(" window.location = '" & sLoginUrl & "'; " & vbCrLf)
sbJS.Append(" }, " & vbCrLf)
sbJS.Append(" success: function(response) { " & vbCrLf)
sbJS.Append(" if (response=='false') { " & vbCrLf)
sbJS.Append(" window.location = '" & sSyncLoginUrl & "'; " & vbCrLf)
sbJS.Append(" }else if(response=='') window.location = '" & sLoginUrl & "'; " & vbCrLf)
sbJS.Append(" } " & vbCrLf)
sbJS.Append(" }); " & vbCrLf)
sbJS.Append(" }); " & vbCrLf)
sbJS.Append("</script> " & vbCrLf)
Me.ClientScript.RegisterClientScriptBlock(Me.GetType(), "VerifyLoginInfo", sbJS.ToString)
Else
Dim sUrl As String = Me.GetLoginURL()
Response.Redirect(sUrl)
End If
End Sub
從上面的 Code 來說明,就是在每個頁面載入後,透過 jQuery ajax 到 SyncLoginInfo.P_VerifyLoginInfo.aspx (Net1.1) 專案,並帶入必要的比對條件(在這個範例中我是用 UserID 和 Autrhority,實際上可能需要把所有必要資料取得檢核碼 ex: md5 ,然後丟過去比對)。透過回傳 true/false 或空值,決定要更新 Session 資料還是要導向登入頁。
P_VerifyLoginInfo.aspx.vb
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsNothing(Session("S_ID")) AndAlso Not IsNothing(Session("Authority")) Then
Dim sS_ID As String = Request("S_ID")
Dim sAuthority As String = Request("Authority")
Dim sOrg_S_ID As String = Session("S_ID").ToString
Dim sOrg_Authority As String = Session("Authority").ToString
If sS_ID.Equals(sOrg_S_ID) AndAlso sAuthority.Equals(sOrg_Authority) Then
Response.Write("true")
Else
Response.Write("false")
End If
Else
Response.Write("")
End If
End Sub
回傳 true 表示一致,不用更新。
回傳 false 表示不一致,則需要重新取得 Session 資料。
回傳 “” 表示 Net1.1 已經 Session Timeout 了。則必須導向登入頁。
--------
沒什麼特別的~
不過是一些筆記而已