• Session简介


    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

    Session简介

    Session 在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
    实际上Session 和cookie是类似的一种维持客户端和服务会话状态的技术,不过Session 安全性要比cookie高,这是因为Session 的数据是存放在服务端上的,所以相对的也会增加服务器的压力,所以Session 被应用于储存一些比较隐私的数据,例如用户名密码和用户的资料等。

    Session与Cookie的区别

    cookie与session最大的区别就是一个是将数据存放在客户端,一个是将数据存放在服务端。cookie是将信息都存放在客户端的浏览器内存或磁盘中,所以不是很安全,别人可以分析存放在本地的cookie数据来进行用户信息的盗窃或进行cookie欺骗。
    所以在安全性上session要好一些,session通信的一般实现形式是通过cookie来实现,与cookie不同的是,session只会保存一个sessionID在客户端,不会像cookie那样将具体的数据保存在客户端,session具体的数据只会保存在服务端上,在Servlet中session数据是被封装在一个对象里,而这个对象会被保存在对象池中,客户端发生请求时会带上它的sessionID,服务端就会根据这个sessionID,来从对象池中获得相应的session对象,从对象中获得session的具体数据,服务端通过这个session数据来保持或改变与客户端会话的状态。

    Session机制

    以上也介绍了Session有两个主要的东西,一个是SessionID,一个是存放在服务端对象池中的Session对象。客户端访问服务端的时候,会先判断这个客户端的请求数据中是否包含有SessionID,如果没有的话,就会认为这个客户端是第一次进行访问。因为是第一次访问,所以服务端会给客户端在对象池中创建一个Session对象(假设这个会话是需要维持的),并生成出这个对象的SessionID,接着会通过cookie将SessionID响应给客户端,同时会把Session对象放回对象池里。客户端接收响应数据后会将SessionID存放在本地,下一次再访问服务端的时候就会把SessionID给带上,服务端就能够通过SessionID获得相应的Session对象,Session就是以这样的一个机制维持会话状态的。
    示意图:

    image

    如何获得Session对象

    在代码中,通过request中的getSession方法来获得Session对象,这个方法可以传递一个布尔类型的参数,如果不传递的话默认为true。
    参数值为true时,会先问客户端有没有传递 SessionID过来,如果没有就会重新创建一个session对象。如果有SessionID,就去池里抓取session对象,对象池里反馈没有session对象的话,也会重新创建session对象。
    代码示例:

    image

    在浏览器可以看到生成的SessionID保存在Cookies中:

    image

    Java代码生成的Session标识一般都是JSESSIONID,这个JSESSIONID的值是唯一的。

    参数值为false时,如果客户端有SessionID就直接从池里抓session对象,没有抓到就返回null,没有SessionID也同样返回null。
    代码示例:

    image

    我把浏览器关闭了再打开SessionID就会被清空,这时候再访问就不会创建session对象了:

    image

    可以看到Cookies中并没有SessionID,这就是true和false参数的作用。

    image

    思维导图:

    image

    Session超时配置和名称配置(web.xml中配置)

    通过web.xml可以设置session的过期时间,当session到了过期时间后,就会被销毁。并且session在浏览器cookies里的名称也可以在web.xml中自定义,配置语法如下:

    image

    运行结果:

    image

    HttpSession接口中的方法

    Session对象是HttpSession接口类型的,所以可以调用HttpSession中的方法,其中有以下几个主要的方法:
    getAttribute(String) 得到键的值
    getAttributeNames() 得到里面存储的键(key)
    removeAttribute(String) 按key删除数据
    setAttribute(String, Object) 存储键和值,如果已经存在值则会覆盖值
    invalidate() 销毁session对象
    isNew() 判断是否是新创建的session对象
    getCreationTime() 得到session对象的创建时间,返回的是长整型格式的时间
    getId() 得到sessionID
    getLastAccessedTime() 得到session的最后的访问时间

    代码示例:

    image

    运行结果:

    image

    如何关闭Tomcat后在磁盘中寄存Session

    正常关闭tomcat ,它会把session中的数据存储到磁盘上,下次启动tomcat的时候会还原数据:
    代码:

    image

    访问之后就正常关闭Tomcat,session数据会保存在磁盘中,下一次启动的时候就会读取出来:

    image

    这个保存路径在控制台打印的日志信息中寻找。

    如果你session数据中保存的是一个自定义对象,那么需要给这个对象实现序列化接口才可以进行保存,不然的话是无法写入到磁盘中的:

    image

    序列化就是将对象的状态信息转换为可以存储或传输的形式的过程,也就是说对象数据需要进行序列化才能存储到磁盘中,不然是无法存储的。
    将对象保存到session数据中:

    image

    这样才能将包含对象数据的session正常保存到磁盘中。

    登录例题

    使用以上的知识点做一个登录的小例题,让客户端能通过session保持登录状态,为了简单化就不涉及连接数据库了:
    Html代码:

    image

    处理登录业务的Servlet代码:

    image

    登录成功的Servlet代码:

    image

    退出登录的Servlet代码:

    image

    运行结果:

    image

    image

    一般只有需要存储session的页面才使用getSession()方法来创建session对象,其他的页面都是调用getSession(flase)方法。

  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/kaigexuetang/p/7879524.html
Copyright © 2020-2023  润新知