IRequiresSessionState接口控制

  刚刚接触.net web端的朋友都会被Session坑过,莫名其妙的不能读取Session数据,后来知道原来有IRequiresSessionState这个接口,不继承的就不能读取Session里面的数据,知道这个以后呢,也不清楚里面具体是如何实现的。对此一直不甘心,于是查了各方面的资料终于模拟出来了。

  在一般处理程序(ashx文件)里面有个一个(HttpContext Context),F12进入HttpContext 类你面你会发现它应该是用了单例的模式,里面有个 public static HttpContext Current { get; set; },应该是确定程序只有一个上下文。接下来可以找到public HttpSessionState Session { get; },这就是我们需要读取Session。

废话少说,首先说明用到了反射。我们来介绍下Type 类中的Type IsAssignableFrom(Type c);方法。假设A类继承了B接口,  Type a = typeof(A);  Type b = typeof(B); 那么 a. IsAssignableFrom(b)的值为ture;这个可以判断类是否继承了IRequiresSessionState。这是第一步。

  第二步就是找到当前访问Session的类。这个就要用到StackTrace类,从名字上来看这个类是用来跟踪代码的。这里面要用到StackTrace 的GetFrame(index)方法和GetMethod(); 。GetFrame(index)这个是从调用的最里层往外层遍历,它的返回值也是StackTrace 。是GetMethod() 返回值是MethodBase,而MethodBase的ReflectedType属性可以得到当前类的Type。

  原理都在上面的,下面的代码是模拟过程。

  

using System;
using System.Diagnostics;
using System.Reflection;
using System.Web.SessionState;

namespace Ztest
{
    public class Program: IRequiresSessionState
    {
        public static void Main(string[] args)
        {
            try
            {
                if (Test.Current.session == null)
                {
                    Console.WriteLine("没有继承IRequiresSessionState");
                }
                else
                {
                    Console.WriteLine(Test.Current.session);
                }
            }
            catch (Exception ex)
            {
            }
            Console.ReadLine();
        }
    }
    public class Test
    {
        private  Test()
        {
            Type basetype = typeof(IRequiresSessionState);
            StackTrace trace = new StackTrace();
            int i = 0;
            Type type;
            while (true)
            {
                ///找到外层第一个调用类
                MethodBase methodName = trace.GetFrame(i).GetMethod();
                type = methodName.ReflectedType;
                if (type != typeof(Test))
                {
                    break;
                }
                i++;
            }

            Boolean key = basetype.IsAssignableFrom(type);
            if (key)
            {
                session = _m;
            }
            else
            {
                session = null;
            }
        }
        private static Test _Current;
        private string _m = "当前类实现了IRequiresSessionState";
        /// <summary>
        /// 模拟session
        /// </summary>
        public Object session { get; set; }
        public static Test Current
        {
            get
            {
                return get();
            }
            set
            {
                Current = value;
            }
        }
        private static Test get()
        {
            if (_Current == null)
            {
                _Current = new Test();

            }
            return _Current;
        }
    }

}

  

时间: 2024-10-05 05:04:42

IRequiresSessionState接口控制的相关文章

HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)

通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到. System.Web.HttpContext.Current.Session["userinfo"]; 但是今天此种方法也失灵了.在做一个小应用时,需要实现IHttpHandler,同时也需要用到用户的标识.但是在这个类中怎么也不能找到Session的值,曝出 System.Web.H

(10)用树莓派B+的GPIO接口控制发光二极管闪烁

从本篇开始,将逐步学习和分享树莓派GPIO相关操作,由于本人也是这方面的小白,关于接口.跳线.面包板.电流电压之类的叙述,可能有不准确的地方,还请大家仅将本系列文章作为入门读物. 本文需要的一些元件:母对公杜邦线N条,面包板1块,暂不需要面包板外接电源,发光二极管(电压2V-3.3V),电阻约400欧1个. 必须要了解的知识:根据树莓派官方文档的描述(见https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/REA

【FPGA】verilog实现的i2c接口控制

i2c协议规范: 一.时钟 首先第一步是产生fast-mode的400khz的scl速率,假设方波高低电平各占一半,即1.25us,理论上不满足规范上scl低周期1.3us,但是绝大多数器件都支持稍微超过400khz的速率. 我们仍打算产生一个规范内的速率.输入时钟clk=20mhz,计数12+1次后翻转,即可产生一个周期为13x2x50ns=1.3us的方波clk_800,这个周期满足规范. 也可以改变计数方式,产生一个高低占比不一样的波形,可以适当提高速率,同时也满足规范. // +clk2

springboot使用多线程调用接口控制层

同样是拿别人的,整体没报错,不过还未经具体测试配置类: package com.tansuo365.test1.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; import org.springframe

Asp.net下使用HttpModule模拟Filter,实现权限控制

在asp.net中,我们为了防止用户直接从Url中访问指定的页面而绕过登录验证,需要给每个页面加上验证,或者是在模板页中加上验证.如果说项目比较大的话,添加验证是一件令人抓狂的事情,本次,我就跟大家分享一个利用HttpModule实现权限验证的方法. 第一步: 在项目中新建一个类.cs文件,本例为Filter,应用一下命名空间,主要是为了访问Session. using System.Web.SessionState; 第二步:让这个类继承IHttpModel和IRequiresSessionS

脑机接口-BCI

---编译硅谷live 脑机接口(英语:brain-computer interface,简称BCI:有时也称作direct neural interface或者brain-machine interface),是在人或动物脑(或者脑细胞的培养物)与外部设备间创建的直接连接通路.在单向脑机接口的情况下,计算机或者接受脑传来的命令,或者发送信号到脑(例如视频重建),但不能同时发送和接收信号.而双向脑机接口允许脑和外部设备间的双向信息交换. 在该定义中,"脑"一词意指有机生命形式的脑或神经

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

1.CC2530的IO口概述 CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC.定时器或USART外设.这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现. I/O 端口具备如下重要特性:    ?? 21 个数字I/O 引脚 ?? 可以配置为通用I/O 或外部设备I/O ?? 输入口具备上拉或下拉能力 ?? 具有外部中断能力. 21 个I/O 引脚都可以用作于外部中断源输入口.因此如果需要外部设备可以产生中断.外部中断

EJB中的Home与Remote接口

学习EJB过程中,看到Home接口和Remote接口经常出现,在这里整理和总结一下,希望对java初学者有一定的帮助. 从英文的角度,我们很容易想到Home代表着本地的意思,从而推出,它调用的必然是本地的方法.实际上,Home 就是用来产生EJB对象的,它也提供了产生和定位remote接口实例的方法. 而Remote,是远程的意思,调用的肯定是远程方法,对客户端来说就是调用的远程服务.Remote接口由用户调 用,并通过其获得EJB对象的引用.在Remote接口中提供了客户调用Enterpris

在一般处理文件中访问Session需要添加IRequiresSessionState

在IHttpHandler 使用Session 通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到. System.Web.HttpContext.Current.Session["userinfo"]; 但是今天此种方法也失灵了.在做一个小应用时,需要实现IHttpHandler,同时也需要用到用户的标识.但是在这个类中怎么也不能找到S