Tôi đang làm việc trong lớp Phiên tùy chỉnh cho khung công tác ASP.Net (cả WebForms và hương vị MVC).
Mặc dù rất cũ, câu hỏi này rất phù hợp và tôi không thể tìm thấy bất kỳ địa chỉ nào khác về vấn đề được đưa ra.
Do đó, tôi chia sẻ giải pháp tôi mã hóa để đảm bảo GUID duy nhất và liên tục cho mỗi cửa sổ và/hoặc tab, giữ an toàn và bảo mật bất kể mức độ làm mới, điều hướng bên ngoài trang web và trả về, xóa bộ nhớ cache, v.v. .
Phép thuật liên quan đến window.name
và được triển khai bằng mã JavaScript bên dưới. Bootstrap dựa trên jQuery, nhưng dễ dàng di chuyển đến các giải pháp jQuery-less.
Lưu ý rằng GUID này được tự động nối vào bất kỳ tài liệu nào hiện có của form
cung cấp các tham chiếu phía máy chủ.
UIGUID.js
được sửa đổi: phiên bản gốc được trình bày một lỗi ở windowLoadSetGUIDOnForms
cho formList.length == 1
//------------------------------------------------------------------------------
//-- guarantees that window.name is a GUID, and that it would
//-- be preserved whilst window life cicle
//--
//-- for frames and iframes, the outermost window determines the GUID
//--
//-- for every form it will be appended a hidden element of id
//-- "this.window.GUID" for server-side references
//------------------------------------------------------------------------------
//-- window.name will be set to "GUID-<A_GUID>"
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//-- Retrieves window GUID, initializing it if necessary -----------------------
//------------------------------------------------------------------------------
function getWindowGUID() {
//----------------------------------
var windowGUID = function() {
//----------
var S4 = function() {
return (
Math.floor(
Math.random() * 0x10000 /* 65536 */
).toString(16)
);
};
//----------
return (
S4() + S4() + "-" +
S4() + "-" +
S4() + "-" +
S4() + "-" +
S4() + S4() + S4()
);
};
//----------------------------------
//-- traverses up in the hierarchy for the outermost window ----------------
var topMostWindow = window;
while (topMostWindow != topMostWindow.parent) {
topMostWindow = topMostWindow.parent;
}
//-- initialize GUID if needed ---------------------------------------------
if (!topMostWindow.name.match(/^GUID-/)) {
topMostWindow.name = "GUID-" + windowGUID();
}
//-- return GUID -----------------------------------------------------------
return topMostWindow.name;
} //-- getWindowGUID -----------------------------------------------------------
//------------------------------------------------------------------------------
//-- Append via jQuery handlers for windowLoad ---------------------------------
//------------------------------------------------------------------------------
$(window).load(
function() {
windowLoadSetGUID();
windowLoadSetGUIDOnForms();
}
) //----------------------------------------------------------------------------
function windowLoadSetGUID() {
var dummy = getWindowGUID();
} //-- windowLoadSetGUID -------------------------------------------------------
function windowLoadSetGUIDOnForms() {
var formList = $('form');
var hidGUID = document.createElement("input");
hidGUID.setAttribute("type", "hidden");
hidGUID.setAttribute("name", "this.window.GUID");
hidGUID.setAttribute("value", getWindowGUID());
if (formList.length == 1) {
formList.append(hidGUID);
}
else {
for (var i = 0; i < formList.length; ++i) {
formList[i].append(hidGUID);
}
}
} //-- windowLoadSetGUIDOnForms ------------------------------------------------
Như POC, tôi nghĩ ra hai kịch bản HTML thể hiện tính duy nhất ngay cả ở các phần tử con trong khung hoặc iFrames
GUIDTest.html
<html>
<head>
<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script language="javascript" type="text/javascript" src="UIGUID.js"></script>
</head>
<body onLoad="alert('Main document: ' + getWindowGUID());">
<iframe id="frame001" src="GUIDFrame.html"></iframe>
<iframe id="frame002" src="GUIDFrame.html"></iframe>
</body>
</html>
GUIDFrame.html
<html>
<head>
<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script language="javascript" type="text/javascript" src="UIGUID.js"></script>
</head>
<body onLoad="alert('iFrame: ' + getWindowGUID());" />
</html>
Mã của bạn đang chạy ở đâu? ProcessID + ThreadID có thể sẽ hoạt động nếu mã của bạn đang chạy như một IE Addon. – EricLaw
Mã đang chạy trong javascript trong Internet Explorer 6, 7 hoặc 8.Tôi không thể sử dụng trình bổ sung IE cho câu hỏi này – mrjohn
Câu hỏi này KHÔNG phải là bản sao của câu trả lời được liên kết. Câu hỏi này rõ ràng là hỏi về việc liên kết một định danh duy nhất với một cửa sổ tab trong IE. Nó không phải là một câu hỏi về làm thế nào để tạo ra một GUID (mặc dù đó có thể là một phần của câu trả lời). – Sarus