【session的简单介绍】
   
     文章目录
    
    
    
    前言
   
`
    书接上文cookie,本次的任务是简单的介绍与cookie有关的session。既然都了解了cookie,那为何不了解一下session呢?
    
    
     (下次的任务即是与这两者也有关的token了,别问为什么这三个分开写,问就是投机取巧,水博客罢了=w=)
    
    
    
    一、什么是session?
   
- . Session 就一个接口(HttpSession)。
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
    
    
    基本机制
   
    session机制采用的是在
    
     服务器端
    
    保持 HTTP 状态信息的方案。为了加速session的读取和存储,web服务器中会开辟一块内存用来保存服务器端所有的session,
    
     每个session都会有一个唯一标识sessionid
    
    ,根据客户端传过来的jsessionid(cookie中),找到对应的服务器端的session。为了防止服务器端的session过多导致内存溢出,
    
     web服务器默认会给每个session设置一个有效期—30分钟
    
    ,若有效期内客户端没有访问过该session,服务器就认为该客户端已离线并删除该session。
   
    
    
    二、常用API
   
- 
     
 getId()方法
 
 :得到sessionid。
- 
     
 invalidate()方法
 
 :让session立刻失效。
- 
     
 getAttribute(String key)
 
 :根据key获取该session中的value。
- 
     
 setAttribute(String key,Object value)
 
 :往session中存放key-value。
- 
     
 removeAttribute(Stringkey)
 
 :根据key删除session中的key-value。
- 
     
 getServletContext()
 
 :得到ServletContext。
- 
     
 setMaxInactiveInterval(long timeout)/getMaxInactiveInterval
 
 :设置/获取session的最大有效时间。
- 
     
 getCreationTime方法
 
 :获取session的创建的时间。
- 
     
 getLastAccessedTime方法
 
 :获取session最后一次访问的时间。
- 
     
 getSession()
 
 :从HttpServletRequest中获取session。
    
    
    三、session的生命周期
   
- 
 public void setMaxInactiveInterval(long timeout)
 
 
 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。
 
 值为正数的时候,设定 Session 的超时时长
 
 负数表示永不超时(极少使用,因为如果不销毁就会一直占用内存空间)
- 
 public int getMaxInactiveInterval()
 
 
 获取 Session 的超时时间
- 
 public void invalidate()
 
 
 让当前 Session 会话马上超时无效
- 
 Session 默认的超时时间长为 30 分钟。
 
 
 因为在 Tomcat 服务器的配置文件 web.xml 中
 
 默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置
1.   <session-config>
2. <session-timeout>30</session-timeout>
3. </session-config>
    默认时长为:30 分钟。
    
    可以通过修改30为其他值可修改web工程下所有session的默认超时时长。
   
    
     如果想修改个别session的超时时长,可通过setMaxInactiveInterval(long timeout) 来进行单独的设置;
    
    
    
     session.setMaxInactiveInterval(long timeout)单独设置超时时长。
    
    
    
    四、session与cookie的对比
   
    
    
    1. 概念
   
    
     session
    
    和
    
     cookie
    
    都是用户登录状态数据
   
    
    
    2.工作流程
   
    
     cookie
    
    由服务器生成,通过响应头Set-Cookie传递给浏览器,cookie由浏览器保存,每次请求服务器时,浏览器都会通过请求头Cookie将对应的cookie传递给服务器,服务器基于请求头Cookie信息进行身份认证。
    
    
     session
    
    由服务器生成,并且保存在服务器,服务器在生成session的同时会生成
    
     与之一一对应的sessionid
    
    ,sessionid有两个作用,一是在服务器端作为查找session的索引,二是作为登录凭据通过响应头Set-Cookie传递给浏览器,并保存在浏览器端。浏览器每次请求服务器都会通过请求头Cookie将sesionid传递给服务器,服务器通过sessionid查询到服务器端保存的session,并基于session进行身份认证。
   
    
    
    3.安全性
   
    在身份认证实践中,session比cookie更加安全,因为session机制会将用户登录状态数据保存在服务器端,浏览器端只有一个
    
     无意义字串sessionid
    
    。而cookie机制将用户登录状态数据保存在
    
     浏览器端
    
    。黑客盗取浏览器保存的cookie,要比盗取服务器保存的session,容易的多。
    
    同时,cookie机制中,服务器无法验证cookie有效期,cookie有效期完全由浏览器管理,同时
    
     浏览器具备多种入口篡改cookie有效期
    
    ,这可能导致cookie有效期被故意篡改导致长期有效。
   
    而session机制中,服务器端可以在生成session时,保持session的有效期和作为cookie的sessionid的有效期一致,并且以
    
     服务器端
    
    保存的session的有效期为准,这保障了即使cookie:sessionid在浏览器端被篡改的长期有效,但是服务器端session的有效期却无法被篡改。
   
    
    
    4.管理难度
   
    
     cookie
    
    保存在浏览器端,浏览器已经有了一套成熟的管理机制:
   
- 
     
 保存
 
 :自动将服务器HTTP响应头中Set-Cookie信息保存在浏览器内存或硬盘中
- 
     
 获取
 
 :自动将保存在浏览器内存或硬盘中的cookie取出作为HTTP请求头Cookie发生给服务器
- 
     
 清除
 
 :自动清除内存或硬盘中失效的cookie
    而
    
     session
    
    保存在
    
     服务器端
    
    ,服务器本身没有内置管理session的机制,需要第三方工具或者人为开发管理代码
   
    
    
    5.性能方面
   
    另外cookie是将每个用户的登录状态数据
    
     分散保存
    
    在
    
     用户个人电脑
    
    上,对于服务器来说内存友好,性能友好。
   
    session是将每个用户的登录状态数据集中保存在
    
     服务器内存或服务器连接的数据库
    
    中,对于服务器来说内存不友好,性能也不友好。
   
    
    
    总结
   
    本文只是空洞地讲解了
    
     一堆概念
    
    ,缺乏实例的支持,有实例会更好地便于我们的理解,这次准备过于仓促了,而且
    
     浏览器与session的关联及其表现形式
    
    我暂时没有找到很好的实例所以也没有提出(参考此处
    
     Session(超详细)
    
    文章末尾有详细谈到,最后的那张图也是非常的到位)。文章参考了许多,但是自己却很少动手实践去观察整个流程,
    
     我这懒狗真是该死啊! ! !
    
    ;文章若有错误还望指出,各种实例及其补充将在后续的文章中
    
     补出
    
    。
   
 
