Session["id"] = user.id.ToString();
Session["name"] = user.name.ToString();
Session["pwd"] = user.password.ToString(); // 實務不建議存明文密碼
Session["time"] = user.LoginTime.ToString();
Session["authority"] = user.limits.ToString();
protected void Page_Load(object sender, EventArgs e)
{
if (Session["id"] == null || Session["name"] == null ||
Session["time"] == null || Session["authority"] == null || Session["pwd"] == null)
{
Response.Redirect("~/Login.aspx", true);
}
if (!IsPostBack)
{
// 頁面初始化邏輯
}
}
public void Clear(object sender, EventArgs e)
{
Session["id"] = null;
Session["name"] = null;
ClearClientPageCache();
Response.Redirect("~/Login.aspx");
}
public void ClearClientPageCache()
{
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.Cache.SetNoStore();
}
<a href="~/Login.aspx" class="atop" target="_self" onclick="clear()">帳戶資訊</a>
<script>
function clear() { <%Clear();%> }
</script>
問題:<%Clear();%> 在頁面**載入時**即執行,非點擊時。導致每次換頁都清除 Session,造成無限重導向登入頁。
<a class="atop" runat="server" onserverclick="Clear">登出系統</a>
// 後置碼
public void Clear(object sender, EventArgs e)
{
Session["id"] = null;
Session["name"] = null;
ClearClientPageCache();
Response.Redirect("~/Login.aspx");
}
| 屬性 | 觸發端 | 執行程式碼 | 適用元素 |
|---|---|---|---|
onclick | 客戶端 | JavaScript | HTML 標準元素 |
onserverclick | 伺服器 | C# / VB.NET | runat="server" 的 HtmlControls |
onclick:瀏覽器端事件,無法直接呼叫伺服器方法。若在 JS 中寫 <% %> 會在**伺服器轉譯階段**立即執行。onserverclick:需搭配 runat="server",觸發 Postback 執行伺服器端事件處理常式。| 屬性/方法 | 作用 |
|---|---|
Response.Buffer = true | 啟用緩衝,先存記憶體再輸出 |
Response.ExpiresAbsolute = 過去時間 | 設定絕對過期時間(HTTP 1.0) |
Response.Cache.SetExpires(過去時間) | 設定 Cache-Control: max-age=0(HTTP 1.1) |
Response.Expires = 0 | 立即過期(分鐘為單位) |
Response.CacheControl = "no-cache" | 要求重新驗證 |
Response.Cache.SetNoStore() | 禁止任何快取(Cache-Control: no-store) |
組合使用可最大相容性地防止瀏覽器快取敏感頁面,避免登出後按「上一頁」仍看到受保護內容。
<asp:LinkButton> 或 runat="server"><a> 搭配 OnClick/OnServerClickSession.Abandon() 完整銷毀工作階段FormsAuthentication.SignOut() 清除驗證 CookieCache-Control: no-store 防止快取