我对我的网站使用基本身份验证,当用户在需要一段时间填写的表单上时会出现问题,他们的会话可能会结束,点击“保存”后工作将会消失,因为他们的会话不再有效的。
我尝试了以下内容:
在web.config中将会话超时设置为1分钟:
<system.web> <sessionState timeout="1"></sessionState>
将以下javascript添加到我的页面,该页面应该每30秒扩展一次会话:
AlertTimeOut = 30000; // Milliseconds, Alert Message
WarnTimeOut = 30000; // Warn Message before 30 sec of session out
setTimeout("WarnUser();", WarnTimeOut);
//setTimeout("AlertUser();", AlertTimeOut);
function AlertUser() {
alert('Your session has been expired, please save your data outside the system [copy the data in word document].');
}
function WarnUser() {
var currentTime = new Date()
var hours = currentTime.getHours()
var minutes = currentTime.getMinutes()
if (minutes < 10) {
minutes = "0" + minutes
}
if (hours > 11) {
var tempTime = hours + ":" + minutes + "PM"
} else {
var tempTime = hours + ":" + minutes + "AM"
}
var ans = confirm("Your login session is about to expire in 5 minutes.Do you want to extend it? - Date: " + tempTime);
if (ans) {
var oImage = new Image;
oImage.src = "tempdummy.gif" + Math.random();
setTimeout("WarnUser();", WarnTimeOut);
}
else {
setTimeout("AlertUser();", AlertTimeOut);
}
}
这是我的main.aspx.cs页面的片段,在等待javascript弹出两次后,我刷新页面,是的,session["userid"]
是null
。我调试了javascript,它确实击中了每一行代码。
protected void Page_Load(object sender, EventArgs e)
{
if (Session["userid"] == null)
{
// the session is no longer valid, i guess the javascript didn't work :(
//redirect user to an error page
}
else
{
username = (string)Session["userid"];
// check user permission, and populate the form here
}
}
我在网上找到了一些使用类似代码的示例:
var oImage = new Image;
oImage.src = "tempdummy.gif" + Math.random();
延长会话,但我想我只是不理解它是如何工作的。这是一个我应该在我的aspx页面的某个地方的图像吗?它是如何工作的?因为它不适合我
---- || ---- || ---- || ---- || ---- || ---- || ---- ||
更新
我也尝试了以下内容:
创建了一个refresh_session.aspx页面,其中只包含一行代码:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("success");
}
然后尝试POST到该页面以刷新视频(根据本文:http://naspinski.net/post/Automatically-refresh-your-users-Session-behind-the-scenes-using-jQuery-and-AspNet.aspx)
我更新的javascript看起来像:
AlertTimeOut = 30000; // Milliseconds, Alert Message
WarnTimeOut = 30000; // Warn Message before 30 sec of session out
setTimeout("WarnUser();", WarnTimeOut);
function TimedOut() {
$.post("refresh_session.aspx", null,
function (data) {
if (data == "success") {
setTimeout("TimedOut();", WarnTimeOut);
alert('refreshed');
}
else { alert('not refreshed'); }
}
);
}
function AlertUser() {
alert('Your session has been expired, please save your data outside the system [copy the data in word document].');
}
function WarnUser() {
var ans = confirm("Your login session is about to expire in 5 minutes.Do you want to extend it? ");
if (ans) {
var oImage = new Image;
oImage.src = "tempdummy.gif";
TimedOut() ;
setTimeout("WarnUser();", WarnTimeOut);
}
else {
setTimeout("AlertUser();", AlertTimeOut);
}
}
frefresh_session中的断点被点击,但是当我刷新页面时,我的default.aspx中仍为NULL :(((((
答案 0 :(得分:0)
这个想法是每次用户在弹出窗口中单击“确定”时从网络服务器获取图像文件,以便扩展会话。
您的网络服务器上有“tempdummy.gif”图片吗?
我仍然对这段摘录感到困惑:
var oImage = new Image;
oImage.src = "tempdummy.gif" + Math.random();
我不明白为什么他们在虚拟图像名称后面放一个随机数。在尝试获取图像时,您可能会遇到404。据我所知,发出导致404的http调用不会延长会话超时。
我会尝试从网络服务器上获取一个真实的(非常小的)小图片,看看是否能让你的会话保持开放状态。