IHttpHandler中使用Session实现原理

简介:

正文

     在Handler中使用Session的时候是从HttpContext中去取的,那么用Reflector直接去找到HttpContext,看他是如何做到的,把整个类用Reflector Disassembler出来,直接搜索关键字IRequiresSessionState,整个类里面只搜到一个,位置是1157行,下面我把代码一贴大家就明白了:

 

public  IHttpHandler Handler
        {
            
get
            {
                
return   this ._handler;
            }
            
set
            {
                
this ._handler  =  value;
                
this .RequiresSessionState  =   false ;
                
this .ReadOnlySessionState  =   false ;
                
this .InAspCompatMode  =   false ;
                
if  ( this ._handler  !=   null )
                {
                    
if  ( this ._handler  is  IRequiresSessionState)
                    {
                        
this .RequiresSessionState  =   true ;
                    }
                    
if  ( this ._handler  is  IReadOnlySessionState)
                    {
                        
this .ReadOnlySessionState  =   true ;
                    }
                    Page page 
=   this ._handler  as  Page;
                    
if  ((page  !=   null &&  page.IsInAspCompatMode)
                    {
                        
this .InAspCompatMode  =   true ;
                    }
                }
            }
        }

      代码说明:

               1.     非常关键的代码 this._handler is IRequiresSessionState 和 this._handler is IReadOnlySessionState ,我们再看关于IRequiresSessionState的说明:指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。而this.RequiresSessionStatethis.ReadOnlySessionState默认都是false的,也就是说默认是不能访问Session的数据,当你继承IRequiresSessionState或IReadOnlySessionState之后访问权被打开!至于在哪里打开,有兴趣的朋友可以继续深究一下,在SessionStateModule这个类里面有更深入的答案,他是通过访问这个类的属性来判断是否需要打开Session的访问权的。

 

结束

     写这篇文章的目的有两个:

          1.     不明白的时候一定要问为什么,不仅如此还是努力尽所能的深究一下。

          2.     学习一下这正模式,虽然不知道是哪条设计模式,但是如果是我的话我可能会写一个abstract来实现这样的功能。

     友情提示:至于Handler的实现可以参考HttpApplication的源代码。



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586469,如需转载请自行联系原作者

相关文章
|
存储 应用服务中间件 API
Session使用和原理分析图与实现原理
Session使用和原理分析图与实现原理
153 0
|
缓存 Java 应用服务中间件
代理和 Session 机制(2)|学习笔记
快速学习代理和 Session 机制
代理和 Session 机制(2)|学习笔记
|
存储 负载均衡 安全
代理和 Session 机制(4)|学习笔记
快速学习代理和 Session 机制
代理和 Session 机制(4)|学习笔记
|
缓存 负载均衡 Java
代理和 Session 机制(1)|学习笔记
快速学习代理和 Session 机制
代理和 Session 机制(1)|学习笔记
|
缓存 负载均衡 Java
代理和 Session 机制|学习笔记
快速学习代理和 Session 机制
代理和 Session 机制|学习笔记
|
存储
Cookie 原理 和 Session 原理的区别:
Cookie 原理 和 Session 原理的区别:
132 0
Cookie 原理 和 Session 原理的区别:
|
PHP
【PHP工具类】SESSION
【PHP工具类】SESSION
112 0
|
安全 前端开发 Java
Spring 获取 request 的几种方法及其线程安全性分析
本文将介绍在Spring MVC开发的Web系统中,获取request对象的几种方法,并讨论其线程安全性。
Spring 获取 request 的几种方法及其线程安全性分析
|
存储 开发框架 .NET
Cookie和Session的作用,区别和各自的应用范围,Session工作原理
Cookie和Session的作用,区别和各自的应用范围,Session工作原理
301 0
|
存储 缓存 NoSQL
从Spring-Session源码看Session机制的实现细节
从Spring-Session源码看Session机制的实现细节
371 0