ASP.Net: EshineASPNet教程-多語言與單一登錄

完整教程鏈接:ASP.Net: EshineASPNet-基於ASP.Net敏捷開發開源框架

之所以把這兩個放在一起,是因爲這兩個模塊都可以放在模板頁面。大家新建網頁的時候默認會繼承System.Web.UI.Page,我們這裏要把這個改一改,新建一個類,名字叫PageBases,這個類繼承System.Web.UI.Page,然後手動修改以後我們創建的每一個頁面,集成PageBases。這樣的好處是,所有頁面公用的屬性和方法我們都在這裏集中定義,其中包括了多語言和單一登陸。

多語言

Asp.Net多語言的實現用的是公共資源文件的方式,多個頁面公用的文本放到App_GlobalResources裏面,使用方法:
前臺:Text=’<%$ Resources:GResource,titletext %>’
後臺:(string)GetGlobalResourceObject(“GResource”, “titletext”)
專用頁面的文本(即這些文本就這個頁面的功能纔會涉及別的頁面不需要),放到App_LocalResources裏面,每個頁面有單獨的文件來存儲,使用方法:
前臺:meta:resourcekey=”Localize1Resource1”
後臺:(String)GetLocalResourceObject(“Localize1Resource1.Text”)
不管是Global還是Local,Resources文件夾裏面的每一個文件都有不同語言的版本,例如
GResource.resx - 默認語言
GResource.en-us.resx - 英語(美國)
GResource.zh-cn.resx - 中文(中國)
系統根據設置自動把對應語言版本的文本替換到相應的文本位置,這個語言的設置就可以用代碼實現了。我們可以重寫頁面的InitializeCulture()方法。

    protected override void InitializeCulture()
    {
        base.InitializeCulture();

        string s = Request.QueryString["language"];
        if (!String.IsNullOrEmpty(s))
        {
            Page.UICulture = s;
            Page.Culture = s;
            Session["language"] = s;
        }
        else if (!String.IsNullOrEmpty(Session["language"] as string))
        {
            this.UICulture = Session["language"].ToString();
            this.Culture = Session["language"].ToString();
        }
        return;
    }

這裏根據url讀取的language的值來設置頁面語言,這是全局的,值保存在Session,後臺也可以使用這個值。
前面講的是頁面文本的多語言處理,除了這個還有數據層面的多語言,也就是數據庫裏面的內容。其中一種方法是給表裏面的每一個字段都設置多個字段來存儲多語言版本,比如title,title_eng這樣。然後根據Session來展示不同的值。例如:

            if (language == "en-us")
            {
                s = "select top 1 msg_eng from tab_news where id=" + id;
            }
            else
            {
                s = "select top 1 msg from tab_news where id=" + id;
            }

這個也language可以作爲參數傳進方法裏面去。另外也可以把不同語言的數據存放在不同的表裏面,但這時候注意千萬不用光用自增id來匹配兩條數據,否則以後會有麻煩的。筆者此前單位的老系統就是中文英文用的分開的表,切換隻用id,但id經常會出現不同步,有1條不同步了後面的數據全都不同步,切記。

單一登錄

大多數情況下,網頁是允許多個人在同一時間用同一賬號登陸的,但是有時候也會希望像遊戲那樣,重複登陸會把前面那個登陸的頂下去,這個完全是由業務決定的。
如果要實現單一登陸,不管是頂下去,還是後面的登不上,我們都需要採取一些機制,這裏分享一種方法,先上代碼。

    public bool AmIOnline(string s, Hashtable h)
    {
        //System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session;
        //Hashtable h = (Hashtable)Application["Online"];

        //繼續判斷是否該用戶已經登陸 
        if (h == null)
            return false;

        //判斷哈希表中是否有該用戶 
        IDictionaryEnumerator e1 = h.GetEnumerator();
        bool flag = false;
        while (e1.MoveNext())
        {
            if (e1.Value.ToString().CompareTo(s) == 0)
            {
                flag = true;
                break;
            }
        }
        return flag;
    }

    public void CheckUser( Hashtable h)
    {
        //判斷用戶是否登陸
        if (Session["id"] == null || Session["id"] == "")
        {
            Response.Redirect("login.aspx", true);
        }
        try
        {
            if (!pc.AmIOnline(Session["id"] + "|" + Session["ip"], h))
            {
                //用戶沒有在線 ,轉到登錄界面
                Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "message", " <script>alert('本帳號在其他地方登陸!'); window.location.href = 'login.aspx';</script>");
                return;
            }
        }
        catch
        {
            //會話過期 ,轉到登錄界面
            Response.Redirect("login.aspx");
            return;
        }
    }

上面第一個函數AmIOnline()把當前Session的id和ip傳進去,ip用來識別唯一,id用來檢查用戶並踢出。這裏有個哈希表用來存儲當前所有在線的用戶,逐個檢查發現匹配,則把原來的記錄刪除,因爲每個頁面都是繼承這個PageBases的,在前一個用戶繼續瀏覽網頁的時候,頁面就會檢查到記錄爲空就會跳轉到登陸頁面並提示帳號在其他地方登陸。用此邏輯來實現單一登陸。

本教程代碼參考EshineASPNet\Web\App_Code\PageBases.cs

完整教程鏈接:ASP.Net: EshineASPNet-基於ASP.Net敏捷開發開源框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章