session原理

我们知道web网站在客户端存储数据有三种形式:1. Cookie   2. hidden(隐藏域) 3.QueryString 其中viewstate什么的都是通过第二种方式隐藏域存储滴。

      客户端存储数据有三种形式,那服务器端有几种呢? 嘿嘿 服务器端有:1. Session 2. Application 3. database 4. caching(缓存) 其中session用的较多,当然数据库是必须的。

      好今天的主角是session,开发过管理系统项目(不限大小)的童鞋应该都接触过session,在管理系统中session最典型的应用就是当用户登录后在服务器端记录客户的唯一标示(比如用户名),然后再另外的页面中使用这个信息,当然也能判断用户是否登录后进入的系统,防止没有授权直接进入系统。

先看一下怎么使用session吧

           //添加一个名为sessionTest的Session并且给他赋值
        Session["sessionTest"] = "test";
           //读取Session名为sessionTest的值
        Response.Write(Session["sessionTest"].ToString());

      1. 很简单吧!除了人为的创建session,还有就是当客户端浏览器访问一个站点的时候,服务端会自动创建一个session来存储客户端的信息,那么问题来了服务端不可能就一个客户端访问吧!会有成千上万的客户端访问它,那么问题又来了,服务端怎么区分不同的客户端呢?
      1.1 说到这就要引入一个新的名词了什么呢 ? 没错 sessionID,那么什么是sessionID呢?

      简单的说当客户端第一次访问某个站点的时候,将会在服务端生成一个唯一的Key,然后发送给客户端,在服务器端通过Key来取得相应的数据。通常,我们将这个key称为SessionID。

      1.2 大家都知道HTTP是无状态的,那么这个sessionID保存到客户端的什么地方呢?想想客户端“我们知道web网站在客户端存储数据有三种形式:1. Cookie   2. hidden(隐藏域) 3.QueryString”   ,这三个你觉得那个更有可能,没错是cookice,当然当客户端禁用cookice的情况先就会采用存储在QueryString中。

     2. 服务端的session

         2.1 在页面对象或者HttpContext对象中,都有一个名为Session的属性,在一次会话中,它们引用的都是同一个对象,定义如下

public virtual HttpSessionState Session { get; }

              在往上来看看HttpSessionState怎么定义的

public sealed class HttpSessionState : ICollection, IEnumerable

             2.1.1 从这个类中我们可以找到操作session 的一些方法,下面是一些常用的方法

复制代码
1 public void Abandon();
2 public void Add(string name, object value);
3 public void Clear();
4 public void Remove(string name);
5 
6 public object this[int index] { get; set; }
7 public object this[string name] { get; set; }
复制代码

从字面意思上就大概知道是什么方法,所以我就不一一解释了,看到6,7行可以知道session可以通过索引的方式访问。
            2.1.2 这个HttpSessionState来自于SessionStateModule。在每次请求处理过程中,HttpApplication在请求的处理管道中会检查当前请求的处理程序是否实现了接口IRequiresSessionState,如果实现了,那么SessionStateModule将为这个请求分配HttpSession。同时SessionModule还负责SessionID的生成  CookIeless会话管理。顺便提一下在使用一般处理程序的时候,默认情况下并没有实现这个接口,所以,如果在一般处理程序中使用Session必须实现IRequiresSessionState接口否则会导致异常。

      3. 客户端的SessionID
          第一次访问某站点的报文

      从相应报文中可以明显的看到服务端为客户端添加了一个Cookice,所以这个Cookice的值就为SessionID,还可以看到服务端并没有指定这个Cookice的过期时间所以这个Cookice会存储在内存中当浏览器关闭后,Cookice会立即消失。

     第二次访问

     从请求报文中很明显的看到,客户端想服务端发送了一个名为ASP.NET_SessionId的Cookice

除此之外如果我们想要在cookie做些其他的工作的话,可以添加内容

 HttpCookie myCo = new HttpCookie("dsa");
 myCo.Value = "heheh";
 context.Response.AppendCookie(myCo);
这样,在此网站中就添加了cookie的对象(不知道这样说对还是不对),我们就可以保证是这次对话了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 JSP 中,session 是用于在服务器端存储用户信息的一种机制,它可以在多个请求之间共享数据。session 是通过 HttpSession 接口实现的,它的工作原理如下: 1. 当用户第一次访问某个 JSP 页面时,服务器会为该用户创建一个 session 对象,并将该 session 对象的 ID 存储在一个名为 JSESSIONID 的 cookie 中,然后将该 cookie 发送给客户端。 2. 当用户发送其他请求时,客户端会自动将 JSESSIONID 的 cookie 发送给服务器,服务器会通过该 ID 来查找对应的 session 对象。 3. 当用户关闭浏览器或者 session 超时时,session 对象会被销毁,其中存储的用户信息也会被清除。 在 JSP 中,我们可以通过内置对象 session 来访问 session 对象,例如 session.getAttribute() 可以获取 session 中存储的属性值,session.setAttribute() 可以向 session 中存储属性值。session 对象是一个 Map 集合,可以存储任何类型的数据,例如基本数据类型、对象、集合等。需要注意的是,session 对象的属性值必须是可序列化的,否则会抛出 NotSerializableException 异常。 使用 session 可以方便地实现用户状态的管理,例如登录状态、购物车信息等。但是需要注意,如果 session 中存储的数据过多或者过于频繁地访问 session,会占用较多的服务器资源,降低服务器的性能。因此,在使用 session 时需要注意合理使用,避免滥用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值