主動偵測另一Framework之Session是否Timeout或有異動

  • 4578
  • 0

主動偵測另一Framework之Session是否Timeout或有異動

Dotblogs 的標籤: , , ,

這篇是接續前一篇:不同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 了。則必須導向登入頁。

--------
沒什麼特別的~
不過是一些筆記而已