簡體   English   中英

防止會話變量在新選項卡中被覆蓋

[英]Prevent session variables from being overwritten in new tabs

我繼承了一個舊的ASP.Net Webforms應用程序,該應用程序大量使用Session變量來存儲用戶提交的應用程序的數據庫記錄ID。 這引起了一些嚴重的問題,即用戶在多個選項卡中為不同的應用程序打開表單,不知不覺地用一個應用程序要覆蓋的數據覆蓋了一個應用程序中的信息。

整個應用程序的通用用法如下所示:

// Get the application ID from the database
var appID = Convert.ToInt32(Session["appID"]);

// Update application using the above ID
UpdateDB("UPDATE Application SET Title='MY TITLE' WHERE id=" + appID);

// Redirect to another step of the form
Response.Redirect("/application/step-2");

由於此問題在應用程序的許多頁面上仍然存在,因此我發現的解決方案不太理想(在本文末尾詳細介紹)。

我的問題:我有什么辦法可以防止新標簽覆蓋現有的會話變量,而不必在整個應用程序中重寫會話訪問權限?

這是我發現的解決方案,由於需要更改應用程序的數量,因此更不是最后的選擇:

  • ViewState("_PageID")到會話變量之前

  • 使用無cookie會話(存儲在URL中)

*以上解決方案可在相關文章中找到: asp.net-會話-多個瀏覽器標簽-不同的會話?

聽起來,AppID在邏輯上不是會話的屬性。 它是頁面或工作流的屬性。

如果您需要存儲在回發之間持續存在的頁面屬性,則可以這樣存儲:

this.ViewState["AppID"] = appID;

並執行更新

var appID = (int)ViewState["appID"]
UpdateDB("UPDATE Application SET Title='MY TITLE' WHERE id=" + appID);

請確保保護您的ViewState ,否則惡意用戶可能會篡改AppID並更新其他人的記錄。

ViewState存儲在頁面本身中,因此不會在選項卡之間泄漏。

聽起來似乎無法重寫代碼以將數據存儲到會話以外的其他地方。

如果確實如此,那么也許最簡單的選擇就是在用戶在第二個選項卡中打開網站時,或者在其他選項卡中的活動修改了AppID時,向網站添加代碼以顯示錯誤。

完全防止出現多個標簽

這是一種實現方法,高級:

  1. 將代碼添加到Application_EndRequest以輸出“ microsession” cookie,該cookie包含每個頁面的時間戳或隨機隨機數。 注意:您必須注意不要為資源請求(例如圖像或CSS)輸出此cookie。 僅在當前請求為頁面時輸出。

  2. 向您的common.js文件中添加一小段javascript(或任何位置,使其在您網站的每個頁面上運行)都可以執行以下操作:

    一種。 在頁面加載時,獲取微會話Cookie,並將其值存儲在Javascript變量中

    b。 偶爾檢查微會話cookie,以查看其是否已更改。 您可以使用計時器來執行此操作,也可以只檢查用戶何時提交任何表單。 請注意,某些設備在選項卡失去焦點時會暫停腳本,因此,如果您使用的是計時器,還應該檢查選項卡何時再次獲得焦點。

    C。 如果cookie已更改,則意味着用戶從您的網站請求了一個頁面,但頁面位於另一個選項卡中。 顯示錯誤。 那時,您可以強迫他們注銷,也可以強迫他們注銷Session.Abandon()並將其重定向到主頁,在該主頁上將自動為他們構建一個干凈的新會話。

只要AppID不變,就允許多個標簽

如果要允許多個選項卡,並且只想在AppID發生意外更改時導致錯誤,則可以將微會話cookie設置為AppID的哈希值,而不是現時值。 這樣,僅當AppID更改時,錯誤才會觸發。 如果您需要檢查多個會話變量,則可以在生成散列之前將它們連接起來(字符串連接可以)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM