我需要为我的OpenUI5应用程序实现一个全面的安全环境。我在服务器端生成session_id
和user_id
,并将它们保存在服务器端(在数据库中)和客户端(在sessionStorage
中)。在这种情况下,在选项卡/页面关闭时销毁会话存储的事实是一个优点。
在onBeforeRendering
事件中,我异步检查我在客户端的session_id
和user_id
是否与服务器端的那些匹配。
onBeforeRendering: function () {
let currView = this;
checkSession(sessionStorage.getItem("SessionId"),
sessionStorage.getItem("UserId"), function (response) {
if (!response.result) {
let oRouter = sap.ui.core.UIComponent.getRouterFor(currView);
oRouter.navTo("login");
}
});
}
这种模式并没有真正让我实现我的需要。由于我以异步方式进行检查,因此客户端有足够的时间呈现视图,视图显示一秒钟,然后用户重定向到登录页面。
此外,如果我复制内部URL(http://myapp:3000/#/productList),关闭选项卡,然后将URL粘贴到新选项卡,用户将被重定向回登录页面,但随后他可以单击浏览器的后退按钮,然后将他带到内部页面。
我设法通过在checkSession
事件上实现相同的onRoutePatternMatched
函数来部分防止这种行为,但后来我面临同样的问题:页面呈现给用户一秒钟然后将他路由回登录页面。
我的另一种方法是处理导航事件,但我不知道如何在单页面应用程序中发现登录页面。
$(window).on("navigate", handleNavigate);
function handleNavigate() {
let path = window.location.pathname;
alert(path);
}
我的问题: 如何在会话存储为空时阻止用户访问内部页面。
您可以使用每次从服务器获取HTTP错误代码时触发的事件。这是requestFailed
(oDataModel
)的https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v2.ODataModel
我想,每次加载页面时,都会向服务器发送请求?如果你没有正确的会话信息,你会得到401正确吗?如果是这种情况,您可以收听该事件并在返回401时执行任何操作。
如果您使用jQuery获取数据,则可以使用ajaxError
获得相同的结果。