利用 UriBuilder 實作 HTTPS 重導網頁

某些時候,程式需要在 SSL 協定下運作才會比較安全,如登入頁。我原先是採用 javasctip 重導的偷懶方式,此法容易理解卻也經常重導失敗,如果 Browser 把 javascript 停用就破功了。而且,就算重導成功了,部份頁面可能會遇到「是否僅要檢視安全傳送的網頁內容?」的安全性警告,也挺困擾的。所以乾脆寫個類別來使用好了。

建立一個父類別 CBasePage
Public Class CPageBase
    Inherits System.Web.UI.Page

    '''
    ''' 是否要使用SSL,而父類別是不使用SSL的
    '''

    '''
    Protected Overridable ReadOnly Property IsUseSSL() As Boolean
        Get
            Return False
        End Get
    End Property

    Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        NeedNotSSL()
    End Sub

    Private Sub NeedNotSSL()
        If (Not Me.IsUseSSL) AndAlso (Me.Request.IsSecureConnection) Then
            Dim NewUrl As New UriBuilder(Me.Request.Url)
            With NewUrl
                .Scheme = Uri.UriSchemeHttp
                .Port = 80
            End With
            Me.Response.Redirect(NewUrl.ToString)
        End If
    End Sub
End Class


再建立一個子類別 CBasePageSSL
Public Class CPageBaseSSL
    Inherits CPageBase

    Protected Overrides ReadOnly Property IsUseSSL() As Boolean
        Get
            Return True
        End Get
    End Property

    Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        NeedSSL()
    End Sub

    Private Sub NeedSSL()
        If (Me.IsUseSSL) AndAlso (Not Me.Request.IsSecureConnection) Then
            Dim NewUrl As New UriBuilder(Me.Request.Url)
            With NewUrl
                .Scheme = Uri.UriSchemeHttps
                .Port = 443
            End With
            Me.Response.Redirect(NewUrl.ToString)
        End If
    End Sub
End Class


多數的網頁只需繼承 CBasePage,有要用到 SSL 協定的頁面再繼承 CBasePageSSL 就可以了。

透過 UriBuilder 可以很方便的取得、改變所要求的網址。

寫完這篇之後,才發現我 Delay 了,哈哈。保哥早就發表了相同的文章了,冏

0 留言