关于asp.net 监测Session是否过期的问题
程序员文章站
2022-06-11 11:41:51
...
如果是在aspx 文件中监测session 是否过期的话,我们可以写个从Page类继承的BasePage类,然后每个aspx对应的处理类继承BasePage 就可以了。
public class BasePage:Page
{
public BasePage()
{
Load += new EventHandler(BasePage_Load);
}
private void BasePage_Load(object sender, EventArgs e)
{
UserInfo userInfo = Session["UserInfo"] as UserInfo;
if (userInfo == null)
{
//跳转到首页
//Response.Redirect("~/Default.aspx");
Server.Transfer("~/Default.aspx");
}
}
}
也可以重写OnInit()方法来判断Session情况。
如果在ajax调用中检查session是否失效上面的方法就不灵了。
如果 是ajax + ashx 的方法来实现的异步调用话:
// Find the URL in the link right next to us, then fetch the data
$.ajax({
url: "../test.ashx",
type: "GET",
dataType: "json",
success: onDataReceived
});
这样我们可以这样来实现检查session是否失效:
/// <summary>
///ashx 文件对应的基类 用于判断用户是否登录(Session是否过期)
/// </summary>
public class BaseHandlerClass:IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
if (context.Session == null)
{
//context.Response.StatusCode = 405;
//context.Response.End();
//跳转到首页
context.Response.Redirect("~/Default.aspx");
}
if (context.Session["UserInfo"] == null)
{
//context.Response.StatusCode = 405;
//context.Response.End();
//跳转到首页
context.Response.Redirect("~/Default.aspx");
}
OnLoad(context);
}
public bool IsReusable
{
get
{
return false;
}
}
/// <summary>
/// 代码实现
/// </summary>
/// <param name="context"></param>
public virtual void OnLoad(HttpContext context)
{
//子类可以重写此函数来实现业务处理
}
}
然后ashx 对应的处理类继承上面的类并重写OnLoad函数来处理具体业务。
但如果用的是ajaxpro 的方式实现异步调用呢?或是ajax + ashx 和Ajaxpro 都用呢?
看文章有写可以用重写IHttpModule的方法来实现
namespace JudgeSessionOutTime
{
public class Module:IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
}
//2.在Init()方法中对Context进行注册AcquireRequestState事件。
public void Init(HttpApplication context)
{
context.AcquireRequestState+=new EventHandler(context_AcquireRequestState);
}
//3.完善AcquireRequestState方法,然后判断session过期
public void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
if (app.Context.Request.RawUrl.EndsWith("aspx") || app.Context.Request.RawUrl.EndsWith("ashx"))
{
if (app.Context.Request.RawUrl.EndsWith("Default.aspx") || app.Context.Request.RawUrl.EndsWith("Login.aspx")) return;
if (app.Context.Session["UserInfo"] == null)
{
app.Response.Write("<script>alert('session到期!');</script>");
}
}
}
}
}
然后在web.config 中添加
<httpModules>
<!--重写IHttpModule类,需要配置的信息-->
<!--<add name="JudgeSessionOutTime" type="JudgeSessionOutTime.Module"/>-->
<!--type后面是命名空间.类名-->
</httpModules>
在context_AcquireRequestState进行session判断,但所有的Ajaxpro的请求都是通过下面的
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/prototype.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/core.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/converter.ashx" type="text/javascript">
<script src="/HeatNetworkInfoPlatformWeb/ajaxpro/Login,App_Web_mdrbqjr9.ashx" type="text/javascript">
中的prototype.ashx、core.ashx、converter.ashx 和App_web_mdrbqjr9.ashx 来实现的,这样就很难过滤。
一劳永逸的方法还未实现,研究中。。。。。。。。。。。
转载于:https://my.oschina.net/u/267603/blog/420587