我正在开发ASP.Net MVC应用程序。
我们使用了sessionState模式SQLServer,我将超时设置为20分钟。
<sessionState mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa"
cookieless="false"
timeout="2" />
Web配置中的代码就是这样。
我也设置了登录页面。
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
现在,当会话过期时,我想将用户导航到登录页面。
我查了很多东西,但我无法理解它究竟是如何工作的?如何在会话到期时导航用户登录页面?
它在InProc模式下工作。我以相同的方式使用它,用户被重定向到会话过期登录。
但我无法在SQLServer模式下完成同样的事情。
我无法理解我错过了什么?
我检查了Session State,还发现了Session timeout handled in SQLServer Mode
编辑: - 我想在为该会话执行另一个http请求时将用户重定向到登录页面。
答案 0 :(得分:1)
通常浏览器不知道服务器上发生了什么。除非发生HTTP往返,否则它将记住从呈现页面开始的会话状态。
此外,您的会话cookie可能是HttpOnly,因此页面无法检查是否存在会话cookie。
实现目标的一种方法是:
在页面中添加隐藏的iFrame。将iFrame的SRC设置为网站中的处理程序
除了返回200 OK,加上刷新标头设置为几秒之外,处理程序不需要做太多操作,以便处理程序不断进行轮询。
context.Response.AddHeader("REFRESH", "2");
将帧破解程序代码添加到登录页面
if (top.location != location) {
top.location.href = document.location.href ;
}
当对过期会话发出处理程序请求时,它将通过表单身份验证重定向到登录页面;当返回登录页面时,它将破坏你的iFrame并将整个窗口重定向到登录页面。
或者,您可以执行其他人所做的事情,即等待用户请求其他页面。
答案 1 :(得分:0)
对我来说,没有将web.config文件中的超时值更改为任何值,原因是ASPState数据库的ASPStateTempSessions表中存在某种残留的旧记录。我必须清空表,然后才进行web.config更改。我浪费了一个小时试图寻找原因,希望这对某人有帮助。
因此,运行此:
从ASPStateTempSessions中删除
答案 2 :(得分:0)
InProc模式与SQLServer模式之间的区别在于,SQLServer依赖MSSQL作业来删除会话。它不会阻止您再次登录。
SqlSessionStateStore 不会主动监视Expires字段。相反,它依靠外部代理来清理数据库并删除过期的会话,即其Expires字段中保存的日期和时间小于当前日期和时间的会话。 ASPState数据库包含一个SQL Server Agent作业,该作业会定期(默认情况下,每60秒一次)调用存储过程DeleteExpiredSessions来删除过期的会话。