Может так случиться, что при наличии открытых окон браузера повторно переданные логин-пароль (уже отличные от предыдущих) не сработают.
Пример: вы зашли из внешней ИС в определенную папку с отчетами веб-интерфейса BIP под пользователем "user1", затем закрыли браузер, сделали logout из вашей исходной системы, НО где-то у вас "крутится" еще один браузер (картинки из "ВКонтакте" вы там смотрели...). И теперь при попытке зайти из вашей ИС под другим пользователем ("user2") вы получите сессию предыдущего пользователя.
Как этого избежать?
Так получается потому что еще жива недавно созданная сессия BIP, а раз браузер не закрывался, то и сессия не прекращалась.
Во-первых, крайне рекомендую использовать стандартную возможность SSO.
Но если это невозможно, то вот небольшой пример, иллюстрирующий как можно с помощью javascript сделать logout в BI Publisher'е перед входом в него под новым пользователем.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1">
<title>Untitled Document</title>
<script type = "text/javascript">
var sBIPHost = 'LOCALHOST';
var sLogin = 'USERID';
var sPasswd = 'USERPASSWD';
var agt = navigator.userAgent.toLowerCase();
var is_ieindex = agt.indexOf('msie');
var is_ie = is_ieindex != -1;
var is_nav = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer') == -1)
&& (agt.indexOf('compatible') == -1) && (agt.indexOf('opera') == -1) && (agt.indexOf('webtv') == -1));
createHiddenIFrame = function(sId, sName, targetDocument, sSrc)
{
var tDoc = document;
if (targetDocument)
tDoc = targetDocument;
var iframe = tDoc.getElementById(sId);
if (iframe)
{
if (sSrc)
iframe.src = sSrc;
return iframe;
}
if (sSrc == undefined || sSrc == null || sSrc == '')
sSrc = 'empty.htm';
if (is_ie)
{
var sHtml = "<iframe src='" + sSrc + "' style='display:none' id='" + sId;
if (( typeof (sName) != 'undefined') && (sName != null) && (sName.length > 0))
sHtml += "' name='" + sName;
sHtml += "'></iframe>";
iframe = tDoc.createElement(sHtml);
tDoc.body.appendChild(iframe);
}
else if (is_nav)
{
var iframe = tDoc.createElement('IFRAME');
iframe.style.visibility = 'hidden';
iframe.style.width = '0px';
iframe.style.height = '0px';
iframe.style.position = 'absolute';
iframe.id = sId;
iframe.src = sSrc;
if (( typeof (sName) != 'undefined') && (sName != null) && (sName.length > 0))
iframe.name = sName;
tDoc.body.appendChild(iframe);
}
return iframe;
};
removeIFrame = function(sId, sName)
{
if (is_ie)
{
if (!sName)
sName = sId;
var tIFrameObject = document.getElementById(sId);
if (tIFrameObject)
{
tIFrameObject.parentNode.removeChild(tIFrameObject);
if (is_nav)
delete window.frames[sName];
}
}
}
function SignOutIFrameOnLoad(event)
{
//alert('SignOutIFrameOnLoad');
var tBIPCallForm = document.getElementById('BIPCallForm');
if (!tBIPCallForm)
{
tBIPCallForm = document.createElement('FORM');
tBIPCallForm.setAttribute("name", 'BIPCallForm');
tBIPCallForm.method = "POST";
document.body.appendChild(tBIPCallForm);
}
tBIPCallForm.action = "http://" + sBIPHost + ":9704/xmlpserver/?id=" + sLogin;
tBIPCallForm.target = "_blank";
if (!tBIPCallForm.passwd)
{
if (is_ie)
tPasswdInput = document.createElement("<input name=\"passwd\">");
else
{
tPasswdInput = document.createElement("INPUT");
tPasswdInput.setAttribute("name", 'passwd');
}
tPasswdInput.setAttribute("type", "hidden");
tPasswdInput.value = sPasswd;
tBIPCallForm.appendChild(tPasswdInput);
}
tBIPCallForm.submit();
var sCallerIFrameID = 'SignOutIFrame';
removeIFrame(sCallerIFrameID);
}
function WindowOnLoad()
{
//alert('WindowOnLoad');
var tSignOutIFrame = window.frames['SignOutIFrame'];
if (!tSignOutIFrame)
{
tSignOutIFrame = createHiddenIFrame('SignOutIFrame', 'SignOutIFrame');
tSignOutIFrame.id = 'SignOutIFrame';
tSignOutIFrame.name = 'SignOutIFrame';
// // // // // // // // // // // // // //
// debugging
//tSignOutIFrame.style.display = '';
//tSignOutIFrame.style.visibility = "visible";
//tSignOutIFrame.style.height = '500px';
//tSignOutIFrame.style.width = '900px';
// // // // // // // // // // // // // //
tSignOutIFrame.onLoad = "SignOutIFrameOnLoad(event)";
tSignOutIFrame.attachEvent("onload", SignOutIFrameOnLoad);
document.body.appendChild(tSignOutIFrame);
}
var tSignOutForm = document.forms['SignOutForm'];
if (!tSignOutForm)
{
tSignOutForm = document.createElement('FORM');
tSignOutForm.setAttribute("name", 'SignOutForm');
tSignOutForm.method = "POST";
document.body.appendChild(tSignOutForm);
}
tSignOutForm.action = "http://" + sBIPHost + ":9704/xmlpserver/signout.jsp";
tSignOutForm.target = tSignOutIFrame.name;
tSignOutForm.submit();
}
window.onload = WindowOnLoad;
</script>
</head>
<body></body>
</html>
Как это использовать:
Сохраните этот код в виде HTML файла на локальном диске.
Исправьте значения переменных sBIPHost, sLogin и sPasswd на корректные в вашем окружении.
Откройте dummy-сеанс браузера.
Запустите только что отредактированный файл.
Посмотрите под кем зашли в интерфейс BIP.
Закройте этот сеанс браузера (дамми-сеанс не трогайте).
Отредактируйте файл снова - укажите другого пользователя и его пароль.
Вновь запустите HTML файл.
Посмотрите под новым ли пользователем вы оказались в интерфейсе BIP.
Для сравнения посмотрите что будет, если не закрывать дамми-сеанс и не делать программный logout. Для этого достаточно в приведенном коде присвоить window.onload не WindowOnLoad, а SignOutIFrameOnLoad.
Комментариев нет:
Отправить комментарий