`

http session 基础知识(转)

 
阅读更多

因为Http的无接连,无状态,所以造就了Cookie,Session的诞生。可以看我的上篇WebApp之Cookie原理。

  Session也是类似Cookie一样的功能,用于记录客户端浏览器与服务器端交互的会话状态。它与Cookie的重要区别是:
  1.Cookie是记录在客户端浏览器本地;(它是不可靠的,客户端浏览器可以不允许服务器记录,还可以删除。)
  2.Session是记录在服务器端的

  那么Session是如何记录的?
  当用浏览器访问服务器的一个请求时,如果要用到Session,服务器会为浏览器窗口开辟一块独一无二的session内存,当其它浏览器窗口再次访问服务器也想用Session时,服务器会为新的浏览器或窗口开辟一块的新的内存。


 
   那有个问题,比如当我第一个页面登陆以后,跳到第二个页面,服务器怎么就知道我是哪个浏览器,怎么知道我属于哪块Session内存呢?而是非常准确地定位到我第一次登陆时创建的那个Sesion,不是其它Session呢?其实这里有一个常用的方法解决这个问题,那就是标记——浏览器第一次来创建Session时,服务器创建一个独一无二的号码标记,标识这个浏览器窗口和这块Session内存是一对一的关系,并将这个标识存储在浏览器窗口中,同时也存储在对应的Session中,当浏览器窗口下次再来的时候把这个标识带过来,服务器就知道根据那个标识去定位Sesssion块了,这个标识就是sessionId,每个浏览器窗口都有一个独一无二的编号SessionId。

  那么就有个问题,SessionId存储在什么地方?假设Session已经存在,当浏览器访问过来,它应该要把SessionId带过来,因为只有这样,服务器才知道根据这个SessionId去定位内存中的哪个Session。所以这样一来,就有了两种创建Session的方式:
  1.通过Cookie,将SessionId存储在Cookie中
  2.通过URL重写,将SessionId作为参数传递

   先说第一种,存储在Cookie中有两种方法,可参考我的上篇WebApp之Cookie原理,即浏览器内存和本地文件。哪种存法比较好呢,显然是内存中,因为服务器端Session内存与浏览器窗口一一对应,浏览器窗口存在,SessionId就存在,浏览器窗口关闭了,SessionId留着就没意义了,新开一个浏览器窗口,SessionId就变了。因此通过Cookie创建Session是将SessionId存储在浏览器内存的Cookie中。这样浏览器每次访问服务器,服务器就可以取到SessionId了。

  那浏览器可以禁止服务器写入Cookie,当浏览器Cookie被禁止了以后,服务器根本无法写入SessionId,那Session就创建不了,也就用不了啦。所以就有了第二种方法:URL重写。
  第二种方法URL重写实现Session:
  response.encodeURL(String url);
  这个方法有两个作用:
  1.转码,当有中文时可以用它来编码,防止乱码。
  2.给URL后面加上SessionId

  测试时,我们可以将浏览器Cookie关闭,并将跳转到Session的URL地址用encodeURL()包起来。这时再访问就会发现,地址栏请求的URL后跟有参数jessionid。



 
  其实这种方式并不常用,如果要将一个网站的每个要访问Session的URL都这样包起来挺费劲的。只有少数大公司,写代码比较规范,严谨的公司才这么干,大部分公司都不会这么写,因为他们认为,你就应该开启Cookie,如果不开,那么你就用了Session,也就用不了他们服务,产品,像新浪,搜狐这样的大公司都这样。其实我们平时在公司做项目也从来不这样写,但那是因为我们不知道这个原理,至少我是到现在才知道的。现在知道了,也不会那样写,呵呵。

  下面以Java代码为例说明创建Session的方法:                                    
  HttpSessioin mySession= request.getSession(true);
  //这里的参数为true说明:如果窗口对应的Session已经有了,直接拿来用,不创建新的。如果窗口对应的Session没有,则创建一个新。反之参数为false的话:如果窗口对应的Session已经有了,直接拿来用,不创建新的。如果窗口对应的Session没有,也不创建新的。

  mySession.isNew();//看Session是不是新创建的

  mySession.getId();//得到SessionId即Cookie中存的Id

  mySession.getCreationTime();//创建时间

  mySession.getLastAccessTime();//最后一次访问Session 的时间,这个用于处理Session自动失效,后面说。

  request.getRequestedSessionId();//request也可以取得sessionId

  request.isRequestedSessionIdFromCookie();//sessionId是否来自Cookie

  request.isRequestedSessionIdFromURL();//sessionId是否来自URL重写

  Session的过期:
  我们知道Http是无连接的,浏览器请求服务器一个页面后,连接就断掉了。我们经常会发现登陆一个系统以后,很长时间不操作它,不去用它,过了些时间再用,它会提示我们重新登陆,这就是Session过期的原因。

  因为服务器不知道客户端浏览器还有没有在访问,可能客户端关机,断电了断网了等。但它服务器不知道,它没有必要为每个浏览器窗口一直保持Session内存不变,这消耗太大了,所以HttpSession有个过期设置,在tomcat的公共web.xml中有

  <session-config>
   <session-timeout>30</session-timeout>
  </session-config>
  Session超时设置,30单位为分钟,根据客户端浏览器最后一次访问服务器Session的时间算起超过个时间,服务器自动销毁Session,清除内存。这个时间我们自己可以改,把它拷到我们项目的web.xml重新设置时间可以了。

  Session的访问,只要是在一个WebApp下创建的Session,同一个WebApp下随便那个路径下都可以得到,不像Cookie一样有路径的问题,它没有。

  总结一下Session的规则:

  1.如果浏览器支持Cookie,创建Session时,会将sessionId存储于浏览器内存的Cookie中

  2.如果浏览器不支持Cookie,必须自己编程,使用URL重写的方式来实现Session:

   response.encodeURL();

 

  3.Session会过期,可以自己设置过期时间

 

  4.Session的访问没有路径问题,同一个WebApp下都可以访问得到。

分享到:
评论

相关推荐

    PHP的session基础

    关于PHP的session的基本使用 认识session的工作原理 1启动session 2读写session的变量 3删除session变量 4session在用户登录中的应用

    spring session介绍和源代码分享.pptx

    分布式session简介和 spring session 源码 解析 适合想了解分布式 session的基础知识,想从源码层面了解spring session的同学

    JAVA基础知识点汇总

    10、Servlet中的forward和redirect有什么区别: ...4)Session(会话对象) 5)Application(应用程序对象) 6)Out(输出对象) 7)Config(配置对象) 8)Page(页面对象) 9)Exception(异常对象)

    python 零基础学习篇9 session的知识梳理 .mp4

    python 零基础学习篇

    Python爬虫应用指南之基础知识

    Python适合在诸多领域的应用,作为软件测试从业者,具备一定的自动化测试基础,再去开展Python爬虫工程应用是更加有优势的。 本系列《Python爬虫应用指南》为笔者结合多年自动化...Session和Cookie基础 代理基本原理

    python程序员面试常见问题汇总 包含:基础知识、爬虫、正则表达式、网络编程、Flask、Django

    包含:基础知识、爬虫、正则表达式、网络编程、Flask、Django。 例如: 1、基础篇:python的优缺点、深拷贝和浅拷贝之间的区别是什么、列表和元组之间的区别等; 2、进阶篇:python中如何使用多进制数字?怎样获取...

    C#程序中session的基本设置示例及清除session的方法

    主要介绍了C#程序中session的基本设置示例及清除session的方法,是C#入门学习中的基础知识,需要的朋友可以参考下

    ORACLE数据库基础知识-华为维护资料

    第1章 ORACLE数据库基础知识 1 1.1 产品概述 1 1.1.1 产品简介 1 1.1.2 基本概念 1 1.2 ORACLE系统结构 2 1.2.1 ORACLE物理结构 2 1.2.2 系统全局区 4 1.2.3 进程 6 1.3 存储管理 7 1.3.1 逻辑结构 8 1.3.2 表...

    jfsky.com-Oracle数据库基础知识

    4.2 如何杀掉吊死session 51 4.3 如何修改字符集 51 4.4 如何追加表空间 51 4.5 如何加大表的maxextents值 52 4.6 如何查询无效对象 52 4.7 怎样分析SQL语句是否用到索引 52 4.8 怎样判断是否存在回滚段竞争 53 4.9 ...

    DB2开发基础知识-存储过程开发

    一、数据类型 二、使用存储过程优点 三、存储过程结构 四、参数定义 五、变量定义 六、赋值语句 七、条件控制语句 ...十二、SESSION临时表 十三、常用函数 十四、数据一致性和完整性 十五、事物隔离级别

    ASP新手必备的基础知识

    下面介绍一些基本知识,供大家参考。 一、数据库连接 以下为引用的内容: &lt;&#37; set conn=server.createobject(adodb.connection) conn.open driver={microsoft access driver (*.mdb)};dbq=&server.mappath...

    PHP知识点梳理与简介

    PHP——基础知识、http-get、http-post、cookie与session、面向对象、mysql扩展、pdo、文件处理、动态图像处理

    第2章 JSP动态网页设计基础

    第2章 JSP动态网页设计基础,也是jsp基础知识

    在.NET上构架企业级应用程序.rar

    软件构架的基础知识 Session 2: .NET软件构架的基础知识 Session 3: 企业级应用程序的构架 Session 4: 案例学习: PetShop .NET Session 5: Teamwork与Bug Tracking 概念工具与实践(可选)

    servlet基础

    注册,登录,ajax,session,controller查询,各种基础知识都会在上面写下来的

    JavaWeb中Session对象的学习笔记

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象,即session对象,这篇文章就为大家详细介绍Session对象的定义、实现原理等基础知识点,感兴趣的小伙伴们可以参考一下

    PHP实现用session来实现记录用户登陆信息

    PHP中session实现记录用户登录信息的问题,也是PHP面试题中比较常见的考点之一,是PHP学习者必须掌握的一个知识点。 对于初入门的PHP新手来说,或许有一定的难度。那么在之前的文章【PHP中session如何存储及删除变量...

    java面试题大全--java基础,struts,spring,ejb等

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    ESP32_Mega_Session

    您可以在Arduino基础知识网中找到最好的文章之一(还介绍了套件中某些组件的用途) 也有ESP32初学者代码: : 要开始探索项目: 酷酷而有趣的YouTube频道: 电子书: : 电子书: : 在这里做的东西: : 很...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    本书内容主要包括三部分,第一部分介绍Java EE开发的基础知识,以及如何搭建开发环境;第二部分详细讲解了JSF RI、EJB 3的Session Bean等Java EE知识;第三部分提供了一个JSF+EJB 3+ JPA整合开发的项目:电子拍卖...

Global site tag (gtag.js) - Google Analytics