C# Http会话问题
我遇到了一个奇怪的问题。我开发了一个网站,它使用会话跟踪特定于用户的信息,以确定特定用户是否有权访问网站的某些部分。我正在使用VSTS2008+.NET3.5+C来开发ASP.Net网站 在我的设计中,当我访问时,如果没有可用的会话ID,将要求用户输入他们的用户名和密码(如果通过密码检查,将授予可用的会话ID);如果会话ID可用,则表示用户具有站点管理权限并经过身份验证,那么用户应该可以访问站点管理器中的所有功能,即所有登录用户都具有访问站点管理器的权限 麻烦的情况是这样的C# Http会话问题,c#,asp.net,.net,session,visual-studio-2008,C#,Asp.net,.net,Session,Visual Studio 2008,我遇到了一个奇怪的问题。我开发了一个网站,它使用会话跟踪特定于用户的信息,以确定特定用户是否有权访问网站的某些部分。我正在使用VSTS2008+.NET3.5+C来开发ASP.Net网站 在我的设计中,当我访问时,如果没有可用的会话ID,将要求用户输入他们的用户名和密码(如果通过密码检查,将授予可用的会话ID);如果会话ID可用,则表示用户具有站点管理权限并经过身份验证,那么用户应该可以访问站点管理器中的所有功能,即所有登录用户都具有访问站点管理器的权限 麻烦的情况是这样的 我从一个新的IE窗口
你知道怎么了吗?我想要的是在步骤(3)中,应该要求用户输入密码。您的会话并没有因为您离开了站点而结束。自上次与站点交互以来,会话在其超时期间保持活动状态。这就是会话信息仍然存在的原因
要回答您的评论,您可以通过调用session.about()来结束会话。如果您想在有人离开站点时执行此操作,我建议您在页面的unload client事件上执行ajax调用,该事件将依次调用Session.about()或至少重置凭据。但是,这可能会很棘手,因为即使您将页面转到自己站点中的另一个页面,卸载也会被调用,因此您也必须进行检查。是的,这是设计的。除非您另行指定,否则默认会话超时为20分钟。您的会话不会因为您离开了站点而结束。自上次与站点交互以来,会话在其超时期间保持活动状态。这就是会话信息仍然存在的原因
要回答您的评论,您可以通过调用session.about()来结束会话。如果您想在有人离开站点时执行此操作,我建议您在页面的unload client事件上执行ajax调用,该事件将依次调用Session.about()或至少重置凭据。但是,这可能会很棘手,因为即使您将页面转到自己站点中的另一个页面,卸载也会被调用,因此您也必须进行检查。是的,这是设计的。除非您另行指定,否则默认会话超时为20分钟。只有当用户删除服务器提供给他的会话cookie时,会话状态才会丢失。或者用户没有请求特定的(
Session.TimeOut
property)时间段。或者如果您在代码中放弃它。只有当用户删除服务器提供给他的会话cookie时,会话状态才会丢失。或者用户没有请求特定的(Session.TimeOut
property)时间段。或者如果您在代码中放弃它。这就是web会话在任何地方工作的方式。避免让用户感到惊讶;你最好接受这种行为
但是如果你真的想让你的用户在停止使用你的网站时注销,下面是如何 我建议将会话超时时间缩短到1分钟,而不是使用卸载事件(这将是一个很难实现的问题,因为很难判断某人何时真的离开了您的站点-如果他们打开了两个访问您站点的窗口会发生什么情况?),使用客户端keepalive:本质上,浏览器每隔几秒钟(比如说,10秒)在预定的url上ping服务器,这除了保持会话活动外,什么也不做 如果需要的话,可以完全不用javascript,通过iframe实现一个带有meta-refresh标记的页面。当然,在javascript中它会更加健壮和简单,但是隐藏的iframe并不太复杂,meta标记也不太复杂。如果服务器端刷新页面支持发送304 Not modified,那么您也将有一个非常低的开销解决方案 在主文件中,您始终会包含以下内容:
<iframe src="keepalive.aspx" width="1" height="1" />
<!--and perhaps use css to hide the iframe - but test that!-->
在keepalive.aspx中,您将包括:
<meta http-equiv="refresh" content="5" />
最后,作为带宽优化,在keepalive.aspx的代码中,可以添加上次修改的响应头,并检查浏览器是否发送了If Not Modified Since请求头,如果发送了,则发送304 Not Modified而不是完整文档
最后,如果你无论如何都依赖javascript(许多这样的基于登录的web应用都是),你可以简单地使用你最喜欢的ajax框架来定期执行请求,而不需要iframe。这就是web会话在任何地方工作的方式。避免让用户感到惊讶;你最好接受这种行为
但是如果你真的想让你的用户在停止使用你的网站时注销,下面是如何 我建议将会话超时时间缩短到1分钟,而不是使用卸载事件(这将是一个很难实现的问题,因为很难判断某人何时真的离开了您的站点-如果他们打开了两个访问您站点的窗口会发生什么情况?),使用客户端keepalive:本质上,浏览器每隔几秒钟(比如说,10秒)在预定的url上ping服务器,这除了保持会话活动外,什么也不做 如果需要的话,可以完全不用javascript,通过iframe实现一个带有meta-refresh标记的页面。当然,在javascript中它会更加健壮和简单,但是隐藏的iframe并不太复杂,meta标记也不太复杂。如果服务器端刷新页面支持发送304 Not modified,那么您也将有一个非常低的开销解决方案 我