【session的简单介绍】

  • Post author:
  • Post category:其他




【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


  1. getId()方法

    :得到sessionid。

  2. invalidate()方法

    :让session立刻失效。

  3. getAttribute(String key)

    :根据key获取该session中的value。

  4. setAttribute(String key,Object value)

    :往session中存放key-value。

  5. removeAttribute(Stringkey)

    :根据key删除session中的key-value。

  6. getServletContext()

    :得到ServletContext。

  7. setMaxInactiveInterval(long timeout)/getMaxInactiveInterval

    :设置/获取session的最大有效时间。

  8. getCreationTime方法

    :获取session的创建的时间。

  9. getLastAccessedTime方法

    :获取session最后一次访问的时间。

  10. 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

保存在浏览器端,浏览器已经有了一套成熟的管理机制:


  1. 保存

    :自动将服务器HTTP响应头中Set-Cookie信息保存在浏览器内存或硬盘中

  2. 获取

    :自动将保存在浏览器内存或硬盘中的cookie取出作为HTTP请求头Cookie发生给服务器

  3. 清除

    :自动清除内存或硬盘中失效的cookie



session

保存在

服务器端

,服务器本身没有内置管理session的机制,需要第三方工具或者人为开发管理代码



5.性能方面

另外cookie是将每个用户的登录状态数据

分散保存



用户个人电脑

上,对于服务器来说内存友好,性能友好。

session是将每个用户的登录状态数据集中保存在

服务器内存或服务器连接的数据库

中,对于服务器来说内存不友好,性能也不友好。



总结

本文只是空洞地讲解了

一堆概念

,缺乏实例的支持,有实例会更好地便于我们的理解,这次准备过于仓促了,而且

浏览器与session的关联及其表现形式

我暂时没有找到很好的实例所以也没有提出(参考此处

Session(超详细)

文章末尾有详细谈到,最后的那张图也是非常的到位)。文章参考了许多,但是自己却很少动手实践去观察整个流程,

我这懒狗真是该死啊! ! !

;文章若有错误还望指出,各种实例及其补充将在后续的文章中

补出



版权声明:本文为qq_18307045原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。