Я сталкиваюсь с проблемой, похожей на проблему в этой другой теме , и мне не хватает идей, поэтому я действительно буду признателен за любую помощь!
Вот в чем дело:
У нас есть приложение ASP, которое использует переменные сеанса и имеет дело с объединением сеансов из-за мультитаб (IE8).
После многих, многих попыток я пришел к следующей реализации:
Я устанавливаю идентификатор для каждой вкладки браузера (для этого я использую sessionStorage ) на стороне клиента.
Для того, чтобы сделать его доступным со стороны сервера (поскольку я не мог найти другой способ), я сохраняю его в файле cookie и перезагружаю страницу.
Наконец, на своих страницах ASP я получаю этот идентификатор из файла cookie и использую его в качестве префикса всех переменных сеанса в приложении.
Вот краткий пример
Javascript (вставляется в самом начале каждого файла asp)
LoadJs();
// Cookie and TabID handler
function LoadJs()
{
if (getInternetExplorerVersion() <= 6)
{
//alert("Exit..... old browser version : " + getInternetExplorerVersion());
return;
}
if (sessionStorage.TabID)
{
// Check value in cookie
var tabIdinCookie = readCookie("tabid");
// if ID in cookie not the same as ID in session update cookie and
// refresh the page to update values in server-side
if(!tabIdinCookie || (tabIdinCookie && tabIdinCookie != sessionStorage.TabID))
{
createCookie("tabid",sessionStorage.TabID);
ReloadPage();
}
}
else
{
// Create random ID
var currentTime = new Date();
sessionStorage.TabID = currentTime.getTime();
// Save ID to cookie
createCookie("tabid",sessionStorage.TabID);
createCookie("usingIE8",true,1);
// Refresh the page to make it available from server-side
ReloadPage();
}
return true;
}
// Redirect to the same page to refresh data at server-side
function ReloadPage()
{
window.location.reload(true);
}
Затем код ASP:
<%
Dim Nm
Nm=""
response.Write("<br>Reading from cookie....")
if (Request.cookies("usingIE8") <> "" )then
if (Request.cookies("tabid") = "") then
'response.Write("<br>No cookie")
'response.flush()
' WHAT TO DO HERE ????
else
Response.Write("<br>Cookie FOUND<br>")
Nm = Request.cookies("tabid")
end if
end if
if (Session(Nm + "LogonTime")="") then
Response.Write("<br><b>Updating session</b><br>")
Session(Nm + "LogonTime") = Now
UpdateInDB(Session(Nm + "LogonTime"))
' Do other stuffs
end if
%>
Я был очень горд тем, что наконец-то смог обойти эту проблему, но я понял, что когда страница выполняет действие после публикации, весь код ASP отображается (с неверным ID префикса) и выполняется (включая операции с базой данных) перед правильным TabID может быть обновлен в cookie, а страница может быть перезагружена с помощью JavaScript. Я имею в виду, что весь код моей страницы выполняется дважды, один раз до и еще раз после обновления ...: - |
Кто-нибудь думает, что можно реализовать smthg наподобие Response.End (), чтобы предотвратить выполнение остальной части кода ASP, если я смогу определить, что мне нужно обновить страницу, не прерывая при этом выполнение javascript? Или дождаться выполнения всего javascript перед любым другим действием на странице?
Я застрял здесь, и я плачу, что вынужден остановиться здесь! Должно быть решение ... Если я смогу найти исправление, его можно применить ко многим приложениям ASP (3.0), которые не будут обновлены до ASP.NET по крайней мере через 3 или 5 лет.
Заранее спасибо,