在处理静态资源请求时获取Session的疑问。
在做一个伪静态处理,重写了HttpModule。
处理是在AcquireRequestState事件,已经通过web.config,设置所有的请求都经过AcquireRequestState。也就是说无论静态、动态或是任何态,只要是请求一定会引发AcquireRequestState事件。
但在调试时出现以下问题:
* 请求是一个准确的aspx或ashx页面时,正常获取session。
* 请求是一个存在的静态页面时,session=null。
* 请求是一个伪静态地址时(不存在该文件或虚拟目录),session=null。
测试过程:
第一步:先提交http://localhost:44172/default.aspx,结果为:
WebModule.context_AcquireRequestState:Session Enabled!
第二步:重新提交http://localhost:44172/default.aspx,结果为:
this's a test
WebModule.context_AcquireRequestState:Session Enabled!
第二步:提交http://localhost:44172/test.htm,结果为:
【显示test.htm登录页面】<--页面内容
WebModule.context_AcquireRequestState:Session Disable!
第四步:提交http://localhost:44172/gn=sim/login(红色部分是是一个作为参数的伪静态地址,实际并不存在。)结果:
WebModule.context_AcquireRequestState:Session Disable!
请问该如何处理,才能让静态资源也能取得Session?
关键代码如下:
Web.config的相关配置修改:
处理是在AcquireRequestState事件,已经通过web.config,设置所有的请求都经过AcquireRequestState。也就是说无论静态、动态或是任何态,只要是请求一定会引发AcquireRequestState事件。
但在调试时出现以下问题:
* 请求是一个准确的aspx或ashx页面时,正常获取session。
* 请求是一个存在的静态页面时,session=null。
* 请求是一个伪静态地址时(不存在该文件或虚拟目录),session=null。
测试过程:
第一步:先提交http://localhost:44172/default.aspx,结果为:
WebModule.context_AcquireRequestState:Session Enabled!
第二步:重新提交http://localhost:44172/default.aspx,结果为:
this's a test
WebModule.context_AcquireRequestState:Session Enabled!
第二步:提交http://localhost:44172/test.htm,结果为:
【显示test.htm登录页面】<--页面内容
WebModule.context_AcquireRequestState:Session Disable!
第四步:提交http://localhost:44172/gn=sim/login(红色部分是是一个作为参数的伪静态地址,实际并不存在。)结果:
WebModule.context_AcquireRequestState:Session Disable!
请问该如何处理,才能让静态资源也能取得Session?
关键代码如下:
public class WebModule : System.Web.IHttpModule, System.Web.SessionState.IRequiresSessionState
{
public void Init(System.Web.HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
void context_AcquireRequestState(object sender, EventArgs e)
{
System.Web.HttpContext context = (sender as System.Web.HttpApplication).Context;
// 处理伪静态地址信息。
if (context.Session == null) // Session空,未登录,调用并显示登录页面。
{
using (System.IO.FileStream fs = new System.IO.FileStream("d:\\webdata\\HTMLLogin.htm", System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
byte[] cxt = new byte[fs.Length];
fs.Read(cxt, 0, cxt.Length);
fs.Close();
context.Response.BinaryWrite(cxt);
}
}
else
{
if(context.Session["test"]==null)
{
context.Session.Add("test","this's a test");
}
else
{
context.Response.Write("<h4>WebModule.context_AcquireRequestState Value=:"+context.Session["test"].ToString()+"</h4><br />");
}
}
// 打印session测试结果。
context.Response.Write("<h4>WebModule.context_AcquireRequestState</h4><br />");
try
{
if (context.Session != null)
{
context.Response.Write("<h4 style='color:#ff0000;'>WebModule.context_AcquireRequestState:Session Enabled!</h4><br />");
}
else
{
context.Response.Write("<h4 style='color:#0000ff;'>WebModule.context_AcquireRequestState:Session Disable!</h4><br />");
}
}
catch (Exception)
{
context.Response.Write("<h4 style='color:#0000ff;'>WebModule.context_AcquireRequestState:Session Error!</h4><br />");
}
}
context.ApplicationInstance.CompleteRequest();
}
Web.config的相关配置修改:
<system.web>
……
<httpModules>
<add name="WebModule" type="WebApp.WebModule,WebApp" />
</httpModules>
……
</system.web>
<system.webServer>
……
<modules runAllManagedModulesForAllRequests="true">
……
</system.webServer>
...全文
相关推荐
SpringMVC拦截器实现监听session是否过期详解
在这个方法内部,首先获取到请求对应的session对象,然后从application(即ServletContext)中通过session的ID来检索是否已存在该session对象。
详解SpringMVC中设置静态资源不被拦截的问题
需要注意的是,配置静态资源映射时,最好避免使用通配符`**`,而是使用具体的目录结构,以防止意外拦截其他非静态资源的请求。同时,确保静态资源路径与实际部署时的文件路径匹配。
Java 使用HttpClient保持SESSION状态
**执行其他需要保持SESSION状态的请求**:现在,当我们创建新的`HttpGet`或`HttpPost`请求时,HttpClient会自动处理Cookie,保持SESSION状态。
站长专用工具--拷贝网站(静态资源)
**HTTP请求与响应**:理解HTTP协议,发送GET请求以获取页面内容,并处理响应数据。3.
nodejs 的 session 简单使用
当用户再次发起请求时,浏览器会在请求头中包含之前设置的Cookie。


