1. 程式人生 > >大型Web 站點 Asp.net Session過期你怎麽辦

大型Web 站點 Asp.net Session過期你怎麽辦

站點 ria send rac 請求 問題 btn b2c title

在 WEB 系統中。 我們通常會用session來保存一些簡單可是卻非常重要的信息。比方Asp.net中常常會用Session來保存用戶登錄信息,比方UserID。為了解決 WEB場大家採用了把session存在DB中,session過期大家一般都採用頁面跳轉,即再次登錄,login後又返回頁面。

個人認為以上設計不是非常好, 對於web場,假設我們把session存在DB那麽新能應該比存內存要慢。所以推薦用分布式緩存的方式來存取Session。 對於Session過期我建議採用cookie來做。在大型站點中Session應該慎用,畢竟它占用server的內容。一個人用戶session假設占用1k的空間,那麽100W用戶同一時候在線 Session要占用多大空間. 曾經我把userID 直接存cookie會有瀏覽器串cookie的問題,比方我用IE login use1,用FF login user2,發現後面login的user信息會覆蓋前面login user的值。

回來發現session過期了,可是sessionID還在,而且該值在cookie裏面。

實現code 例如以下:

核心code:

string UserID
{

get
{
if (Session["UserID"] != null)
{
return Session["UserID"].ToString();
}
if (Request.Cookies[Session.SessionID.ToString()] != null)
{

string cv=Request.Cookies[Session.SessionID].Value;
Session["UserID"] = cv;


return cv;
}
return string.Empty;
}
set
{
Session["UserID"] = value;
string key = Session.SessionID.ToString();
HttpCookie kc = new HttpCookie(key, value);
kc.HttpOnly = true;
Response.Cookies.Add(kc);
}

}

public partial class WebForm1 : System.Web.UI.Page
    {
        protected void btnSet_Click(object sender, EventArgs e)
        {
            Session["name"] = "majiang";

            this.lblSet.Text = "Session ID:" + Session.SessionID.ToString();
        }

        protected void btnGet_Click(object sender, EventArgs e)
        {
            labGet.Text = "Session ID:" + Session.SessionID.ToString();
            if (Session["name"] != null)
            {
                labGet.Text += "<br/>" + Session["name"].ToString();
            }
        }

        Dictionary<string, string> dict = new Dictionary<string, string>();
        protected void Page_Load(object sender, EventArgs e)
        {
            dict.Add("1", "majiang");
            dict.Add("2", "Gavin");
        }

        string UserID
        {

            get
            {
                if (Session["UserID"] != null)
                {
                    return Session["UserID"].ToString();
                }
                if (Request.Cookies[Session.SessionID.ToString()] != null)
                {
                     
                    string cv=Request.Cookies[Session.SessionID].Value;
                    Session["UserID"] = cv;
                    return cv;
                }
                return string.Empty;
            }
            set
            {
                Session["UserID"] = value;
                string key = Session.SessionID.ToString();
                HttpCookie kc = new HttpCookie(key, value);
                kc.HttpOnly = true;
                Response.Cookies.Add(kc);
            }
        }
        protected void btnSetwithCookie_Click(object sender, EventArgs e)
        {
            UserID = this.txtuserID.Text.Trim();
            this.labsetCookie.Text = Session.SessionID.ToString();
        }

        protected void btnGetWithCookie_Click(object sender, EventArgs e)
        {
            this.labGetCookie.Text = "Session ID:" + Session.SessionID.ToString();

            labGetCookie.Text += "<br/>" + dict[UserID].ToString();

        }
    }
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SessionTest.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <asp:Button ID="btnSet" runat="server" Text="Set Session" OnClick="btnSet_Click" />
            <asp:Button ID="btnGet" runat="server" Text="Get Session" OnClick="btnGet_Click" />
            <br />
           SET: <asp:Label ID="lblSet" runat="server" Text=""></asp:Label>
            <br />
           Get: <asp:Label ID="labGet" runat="server" Text=""></asp:Label>
        </div>
        userID:<asp:TextBox ID="txtuserID" runat="server"></asp:TextBox>
        <div>
            <table>
                <tr><td><asp:Button ID="btnSetwithCookie" runat="server" Text="Set With Cookie" OnClick="btnSetwithCookie_Click" /></td><td><asp:Button ID="btnGetWithCookie" runat="server" Text="Get With Cookie" OnClick="btnGetWithCookie_Click" /></td></tr>
            <tr><td><asp:Label ID="labsetCookie" runat="server"></asp:Label> </td><td><asp:Label ID="labGetCookie" runat="server"></asp:Label></td></tr>
            </table>
        </div>
    </form>
</body>
</html>

實現的效果如圖:

技術分享

技術分享

看看HTTP的請求:
技術分享

技術分享



大型Web 站點 Asp.net Session過期你怎麽辦