zoukankan      html  css  js  c++  java
  • Web核心之会话技术Cookie&Session

    什么是会话技术?

    http协议是无状态协议。为了满足在多次请求之间数据进行交互,推出了会话技术。
    会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止。中间可能进行多次的请求和响应的过程。
    会话分类:根据存储位置的不同,我们把会话技术分为两类。
    客户端会话技术:Cookie
    服务器端会话技术:Session

    Cookie

    Cookie入门,关闭浏览器后不保存cookie

    创建并设置:

    直接new即可,Cookie只有有参构造。Cookie是键值对格式的数据,
    可以创建多个cookie对象,由于是键值对,key相同的cookie会被覆盖掉。

    获取cookie:

    演示:

    先在浏览器中输入:http://localhost/ServletCookie
    后再浏览器中输入:http://localhost/getCookie

    原理

    当我们设置cookie时,底层实际是在响应头中添加了一个set-cookie的头。里面设置了cookie的键值对。
    当我们发送请求时,浏览器会自动把符合规则的cookie放入请求头中。使用cookie头携带cookie的键值对到服务器。

    Cookie持久化,关闭浏览器依然保存cookie一段时间

    1. 默认情况下,Cookie会存储在浏览器的内存中。是一个临时数据,一旦会话结束(浏览器关闭),cookie就会被销毁掉。
    2. 当我们调用Cookie的setMaxAge()方法时,
      如果指定一个正数,就可以把Cookie持久化。

      Cookie的name要保持一致。

    Cookie要删除,除了设置maxAge为0之外,还需要设置Cookie的path与要删除的cookie保持一致,如果要删除的Cookie有domain,也需要设置domain与其保持一致。

    Cookie存储中文

    理论上是不支持的。因为Cookie的数据是在头中,HTTP协议的头中不允许出现中文。
    我们可以使用URL编码和解码的方式进行特殊字符的存储。

    存储的时候:

    获取的时候:

    Cookie的有效路径setPath()

    全局共享:

    一个tomcat下部署的多个web项目能不能共享cookie信息需要设置setPath(),setPath("/")为服务器共享。

    特定web项目共享:

    此处指定一个路径,当浏览器发送请求时,如果请求的路径和指定的path规则相同,则会把该cookie携带过去。
    setPath("/day16/aaa")
    如果访问 http://localhost:8080/day16/servletDemo1,cookie是不会携带的
    如果访问 http://localhost:8080/day16/aaa/servletDemo1,cookie是会携带的

    默认共享范围:

    如果不手动指定Path,cookie会设置一个默认的path。规则是:
    请求某个资源,如果响应中设置了cookie,默认会根据该资源的访问路径,截取到最后一个/作为path。
    例如:
    假设访问http://localhost:8080/day16/aaa/servletDemo1,响应中返回了一个cookie,那么它的默认path为 /day16/aaa
    假设访问http://localhost:8080/day16/servletDemo1,响应中返回了一个cookie,那么它的默认path为 /day16
    因为默认设置十分混乱,所以推荐在设置cookie时,手动明确设置一个有效路径。
    一般设置为项目的虚拟目录,或者 /

    Cookie的有效域名setDomain()

    一般指定一个一级域名, 当一级域名相同时,该cookie都会携带过来例如:setDomain(".baidu.com")

    Cookie特点:

    数据存放在客户端,安全性比较差

    数据只能存储字符串,而且数据存储的大小和cookie的数量都有限制。

    cookie一般用于存储少量的,对安全要求不高的数据。

    例题:




    Session

    概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的HttpSession对象中。

    服务器端会话技术:

    域对象

    作用范围:一次会话,每个不同的浏览器发起会话时创建不同的session,所以session是会话级的技术

    创建:在一次会话中,服务器端第一次调用request.getSession()时会创建session





    销毁:session存储在服务器,与浏览器无关

    1. 服务器关闭

    2. session.invalidate()session自杀

    3. 如果session空闲时间超过配置的超时时间,则会自动销毁。

    session的失效时间
    在web.xml中配置即可:

    细节:

    当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

    默认情况下,不是。因为客户端关闭后再次链接服务器,不再是原来的cookie头。
    以下是两次session的地址,可见的确不同。

    如何解决这种问题?(不推荐解决这种问题,违背设计初衷)

    可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存

    客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

    不是,服务器都关了,session肯定没了。但是服务器关闭更新需要保留用户信息,这里需要服务器的钝化和活化。

    session的钝化和活化

    钝化(序列号):服务器正常关闭时,把内存中的session对象序列化到硬盘上进行存储。

    注意:如果session中存储了对象,想要在钝化时把存储的对象也一并序列化。该对象必须实现序列化接口。

    活化(反序列化):服务器启动时,把硬盘上的session文件反序列化到内存中,生成一个session对象,和之前存储的session对象的数据和id都一致。

    获取:
    	request.getSession()
    

    session的原理:

    session底层是基于cookie实现的。在请求和响应时,cookie会存储或携带session的id进行交互。
    第一次获取session,没有cookie,这时候会在内存中创建一个新的session对象,这个session有唯一id:xxxxxxxxxx
    给浏览器做响应时,会把响应头的set-cookie:JSESSIONID=xxxxxxxxxx 发给浏览器。浏览器接收这个对象,
    下次浏览器访问资源的时候就会携带这个响应头,通过请求头cookie携带JSESSIONID=xxxxxxxxxx 。
    服务器会根据这个cookie信息里的JSESSIONID,去找这个session对象[HttpSession session = request.getSession();],
    所以就找到了这个session对象,session对象唯一。服务器就是通过cookie的方式确保session在一次范围内多次获取是同一个。

    Cookie和Session的区别

    1. 数据存放在客户端,安全性比较差

    2. 数据只能存储字符串,而且数据存储的大小和cookie的数量都有限制。

    3. cookie一般用于存储少量的,对安全要求不高的数据。

    Session

    1. 数据存放在服务器端,安全性比较高

    2. 数据类型没有限制,大小和数量理论上也没有限制。

    3. session一般用于存放一些私有数据。例如:登录后的用户信息、购物车信息……

    一次性验证码实现

    1. 验证

    	当验证码生成时,正确的验证码存入session中
    	提交的验证码和session中的进行比较
    

    2. 保证一次性

    	一旦验证码从session中取出,就把它从session中移除掉。
  • 相关阅读:
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    团 队 作 业 ———— 随 堂 小 测
    Alpha 冲刺 (5/10)
    Alpha 冲刺 (4/10)
    Beta冲刺博客汇总(麻瓜制造者)
    Beta冲刺(3/5)(麻瓜制造者)
    快速搭建一个Express工程骨架
    个人作业——软件产品案例分析
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/12079004.html
Copyright © 2011-2022 走看看