zoukankan      html  css  js  c++  java
  • Cookie,session的原理及用法

    会话的定义

    在说明cookie之前,我们需先了解会话的概念。
    会话指的是从浏览器发送给服务器的第一次请求开始,直至访问服务器结束,浏览器关闭,这期间浏览器与服务器之前产生的所有请求及响应称之为一次会话。


    在一次会话期间,总是会产生许多数据,而有些数据是需要我们保存起来的,那么如何保存这些数据呢?
    举例:
    1.在登录的情况下去淘宝买东西,将商品加入到购物车中,那么如何记录这个商品保存在购物车中的信息呢?(保存到数据库中)
    2.在未登录的情况下在淘宝买东西,将商品加入到购物车中,这时因为没有登录,所以无法将数据保存到数据库中。
    这个时候就可以将数据保存到cookie或session中


    如何将数据保存到cookie或session中?

    cookie的工作原理

    1.cookie是将会话的数据保存到客户端,是客户端技术。
    2.cookie是基于两个头进行工作的:分别是Set-Cookie响应头和Cookie请求头
    3.通过set-Cookie响应头将会话中产生的数据保存到cookie中,并将其保存在客户端,当客户端再次访问服务器时
    通过cookie请求头获取到cookie中保存的数据。

    cookie的API及应用

    1.创建cookie对象

    Cookie cookie=new Cookie(String name,Object value);
    //创建cookie时需要指定cookie的key值及需要保存的value
    

    2.将cookie放到响应中

    response.addCookie(Cookie c);
    //将cookie添加到响应中,由服务器将cookie发送到客户端,并由客户端保存,可多次调用,添加多个cookie
    

    3.获取请求中的cookie数组对象

    Cookie[] cookie=request.getCookies();
    //获取请求中携带的所有cookie数组,如果请求中没有携带cookie则会返回null
    

    4.删除cookie

    //cookie没有提供直接删除的方法,但是可通过其他方法间接删除
    //可以新创建一个cookie,cookie的名字与想要删除的cookie名字一致(因为浏览器是根据cookie的名字区分cookie,当传过去一个名字相同的cookie时,就会覆盖原cookie),这时再设置改cookie的最大存活时间为0,当浏览器接收到这个cookie后,会覆盖原cooki并立即删除
    

    5.cookie的常用方法

    cookie.getName();//获取cookie的名称
    cookie.getValue();//获取cookie的值
    cookie.setValue();//修改cookie中的值(cookie不能修改名称,因此没有setName)
    cookie.setMaxAge();//设置cookie的最大存活时间
    

    6.setMaxAge();设置cookie的最大存活时间
    设置cookie的最大存活时间,时间单位是秒,如果没有设置cookie的最大存活时间,则默认cookie是一个会话级cookie(即存活时间只有一次会话,一次会话之后,cookie就会自动销毁),如果设置了该方法,则cookie就不会保存至浏览器的内存中,会持久化到硬盘中,当浏览器重新启动时会读取硬盘中cookie的信息。
    代码示例:

    Cookie cookie = new Cookie("cart",prod);//新建一个cookie对象
    cookie.setMaxAge(24*60*60);//设置最大存活时间为24小时
    response.addCookie(cookie);//将cookie添加到响应中
    

    session的工作原理

    1.session是将数据保存到服务端,是服务端技术
    2.session是一个域对象,session中保存了一个map对象,往session中存储数据时,其实就是将数据保存到session的map中。
    3.通过session的setAttribute()方法将数据保存到session中,通过getAttribute()方法将数据从session中取出。


    sessin是一个域对象

    获取session对象

    request.getSession();//如果服务器中存在该浏览器对应的session对象,则返回,如果没有则新建一个session对象
    

    session对象是一个域对象,因此session也提供存取数据的方法

    session.setAttribute();//将数据存到session对象中
    session.getAttribute();//将数据从session对象中取出
    

    session的三大特征

    1.生命周期
    创建session:第一次调用request.getSession()方法会创建一个session对象。
    销毁session:
    1)超时销毁,一般默认超过30min没有访问session对象,session就会自动销毁(超时时间可修改,但不推荐)
    2)自杀,调用session的invalidate方法会立即销毁session
    3)意外身亡,当服务器非正常关闭时,(例如断电,崩溃,内存泄漏等),session会随着服务器的关闭而销毁。
    当服务器正常关闭时,服务器会将内部的session对象序列化后保存到服务器的work目录下,变为一个文件,这个过程叫做session的钝化(序列化),当服务器重启时,钝化的session对象会再次回到服务器中变为对象,这个过程称之为session的活化(反序列化)

    2.作用范围
    再一次会话期间获取到的都是一个session对象
    3.主要功能
    在整个会话期间实现数据共享

    总结,两者的区别

    Cookie和Session都是会话级技术,都可以保存会话中的数据,但是由于两者的工作原理及特点不同,应用场景也不同。
    cookie的特点:
    1.cookie是将数据保存在客户端,是客户端技术。(js可以直接访问cookie)
    2.cookie数据容易随着用户的操作,导致数据丢失或窃取。因此cookie中的数据既不稳定,也不安全
    3.cookie是将数据可以保存在客户端,对服务端没有什么影响,可以存储较长时间。
    4.浏览器对存储的cookie的大小及个数都有限制,一般推荐每一个站点存储的cookie不超过20个,每个cookie大小不超过1kb
    5.总结:cookie适合存储需要存储时间较长且对安全性要求不高的数据。
    6.cookie的应用:购物车,记住用户名,30天内自动登录

    session的特点
    1.session是将数据保存到服务端,是服务端技术。
    2.session是将数据保存在服务端的session对象中,不会随着用户的操作丢失或被窃取。相对更加安全和稳定。
    3.session存储在服务端,当并发量较高时,会占用大量服务器内存,影响效率。
    4.总结:session适合存储对安全性要求较高但是存储时间不长的数据。
    5.session的应用:保存登录状态,保存验证码等。


    扩展:获取不到之前的session问题

    session创建时会创建一个唯一的id用来代表这个session,称之为sessionid
    session是基于cookie进行工作的,创建session时,服务器会创建一个cookie用来存放sessionid,然后把cookie保存到浏览器,
    但是当浏览器关闭时,cookie就会销毁,浏览器再次打开时就无法找到之前的session了。

    解决方法
    当创建session时,我们手动创建一个cookie,指定这个cookie的名字为SESSIONID,将sessionid存储到这个cookie中,并设置cookie
    的最大存活时间(即将cookie保存到硬盘中),当浏览器重启时就会读取硬盘中cookie的信息,从而获得sessionid后找到服务器中对应的session。

  • 相关阅读:
    Linux课程实践一:Linux基础实践(SSH)
    《恶意代码分析实战》读书笔记 静态分析高级技术一
    Linux课程实践四:ELF文件格式分析
    Linux课程实践三:简单程序破解
    Linux课程实践二:编译模块实现内核数据操控
    2020.12.19 加分项和课程意见/建议
    博客已换
    [题解] LuoguP4983 忘情
    [题解] LuoguP4767 [IOI2000]邮局
    [题解] LuoguP2791 幼儿园篮球题
  • 原文地址:https://www.cnblogs.com/planted/p/15179872.html
Copyright © 2011-2022 走看看