Session 工作原理

声明:这是转帖的,内容来自网络

http://blog.csdn.net/wangzhkai/article/details/4187496

http://lijiejava.iteye.com/blog/487635


不得不说当我了解了session的原理之后感觉到了惊讶,因为session竟然是基于cookie的,所以当一向被认为不安全的cookie和超安全的session等同之后确实很让人接受不了,因为我确实是菜鸟
做了这么多年的web,用了这么多年的session和cookie,竟然就习惯了这两个东西,把他们的功能当成了天然的功能,从来没有考虑过他们的原理,实在是悲哀,直到有一天,我觉醒了。。
首先应该了解http协议的请求过程,这个以前倒是知道,当然是基于tcp/ip协议,客户端请求服务器,服务器回答客户端,无状态的,那么服务器如何区分客户端的呢?看完本文自然明白了


关于cookie


先来说cookie,怎么使用就不说了,cookie按照在客户端存放的方式,可以分为两类,
一种是会话性质的cookie,存放在浏览器内存中,当你在用代码向客户端写入cookie的时候,如果没有指定过期时间,那么cookie是存放在浏览器的内存里面的,不会持久化在硬盘上,也就是你在浏览器的临时文件里找不到!
一种是持久化的cookie,存放在硬盘上,当你指定了cookie的过期时间,那么,在客户端写入cookie的时候就会在浏览器的临时文件下生成一个文件,具体格式和名字可以到浏览器临时文件去看下


cookie的原理是这样的:当你在服务器端的代码里写了response.cookie["mycookie"]="mytestcookie"的时候,返回给客户端的http响应中,会在http相应头中加入cookie的信息,浏览器收到相应后,会按照http响应头里的cookie在客户端建立cookie。
客户端的cookie也是插在http头中发送到服务器端的,并且,一个域,在客户端建立的所有cookie,在客户端的每一次的http请求都会带着,比如testwebsite.com这个站点,任何时刻写到客户端的cookie,只要不过期,浏览器在向testwebsite.com发送http请求的时候,会带上这些cookie,所以cookie在客户端的大小是有限制的


关于session
cookie明白了之后session就容易理解了,asp的session和asp.net默认的session就是通过第一种cookie来实现的,你可以把自己的浏览器的cookie彻底禁用,然后再去登录一些注册过的门户网站,会发现很多都登录不了了。是cookie,将http的请求变得有状态。session的实现是web服务器的事情,不过很显然是利用会话cookie,也就是存放在浏览器内存里的那种cookie来实现的在cookie里只是存放了SessionID,然后在服务器上建立了一张表,对应客户端的SessionID。这张表是存放在服务器上的进程中的,也就是服务器的内存里,也就是Application里。当客户端请求服务器的时候,如果服务器发现这是一个新的请求,就会分配给他一个SessionID,也就是在浏览器写入一个sessionID的cookie。你可以试一下,在你请求过一次服务器之后,在服务器遍历客户端所有的cookie,就会发现这个叫做SessionID的cookie。
所以在了解了这个session的原理之后我们可以自己来造一个自己的session,过程就不说了。

那么我们现在可以说session就是依赖于会话性的cookie的


Url实现Session

通过cookie可以很好地实现session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用cookie,在这种情况之下,为了使session能够继续生效,可以采用url重写。url重写很简单,比如我要从1.jsp页面跳转到2.jsp,采用超链接的方式,可以用两种方式:一种如下所示: 
<a href="2.jsp">2.jsp</a> 
另一种是<a href="<%=response.encodeURL("2.jsp")%>">2.jsp</a> 
其中第二种方式就是采用了url重写,在cookie没有被禁用的情况下,它与第一种情况没有什么区别,但在cookie禁用是,它会将SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。


测试:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>   
    <title>session实现原理</title>   
  </head>  
    
  <body>  
     <%  
        Cookie [] c = request.getCookies();  
        if(c==null){  
           out.println("sorry,cookie is null...");  
        }else{  
           for(int m =0;m<c.length;m++){  
              out.println(c[m].getName()+" "+c[m].getValue()+"<br>");  
           }  
        }  
     %>  
  </body>  
</html> 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值