ajax调用过程中如果是session丢失,则必须从mudole的类返回session丢失的标志,ajax再根据服务端返回的标志在客户端重设浏览器的url地址到登录页面。要区分好ajax请求和本身浏览器的请求,ajax只能看成是整个页面的一部分而已。ajax请求在服务端的处理都不会影响到包含该ajax的整个页面。要影响本页面必须通过ajax得到响应后编写相应的javascript来操作页面或浏览器。

解决方案 »

  1.   

    开始登录时设置一个状态值,IsLogon=true,如果session已经超时,那么一访问时IsLogon自动变成False那么在母版面里有个登录每个页的登录口,在
    protected override void OnInit(EventArgs e)
    {
    }
    里面,超时后重定向应该在这里处理        protected override void OnInit(EventArgs e)
            {
                if (!HttpContextUtility.IsLogon())
                {
                    FormsAuthentication.SignOut();
                    Response.Redirect("~/Login.aspx");
                }
                else
                {
                     Response.Redirect("实际需要访问的页URL");
                }            base.OnInit(e);
            }
      

  2.   

    我明白你的意思 但是整个项目很多都是通过ajax方式 我不可能每个页面去修改代码在返回值里重定向,你有什么好的思路没有
      

  3.   

    我明白你的意思 但是整个项目很多都是通过ajax方式 我不可能每个页面去修改代码在返回值里重定向,你有什么好的思路没有
    可以重构一下发送ajax和得到响应的javascript,写一个函数放一个js文件里面,函数可以包含要发送的url地址和传输的数据,还有一个对响应数据进行处理的回调函数指针,这样的一些参数,函数体里面对响应数据进行判断,是否是session丢失,如果是则跳到登录页面,如果session不丢失的话则调用传到该函数的回调函数对数据进行处理。有用到ajax的页面则统一引入该js文件,并在需要的时候调用该函数。也可以做个母板页,在母板页里面引入js,其他页面创建为内容页,这样就可以简化操作。
      

  4.   

    Session需要巨大的代价。asp.net需要将所有的Session集合中搜索出当前会话相关的Session单元,然后拷贝给你的 HttpHandler 对象。等它处理完了,还要再靠背回去。即使你的 HttpHandler 根本不用Session 集合也是如此。因此默认地,你就不应该在Ajax的后台处理中使用Session集合。任何一种想当然地给它(即使你根本不用)传Session集合的机制都应该抛弃。也就是说,如果你的“现在webconfig配置有httpmudole写了一个类”不能修改从而避免为Ajax后台服务传Session集合的话,那么就扔掉这个类吧!
      

  5.   

    看到说“Session丢失”我们就会偷偷发笑。你应该从一开始设计asp.net程序时就“不用Session集合”。或者,从一开始就知道如何使用“asp.net state server”服务,并且保证你放到Session集合中的对象都可以序列化。