cookie和session

标签: cookie  session

一.Cookie概述

1.会话的概念

用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求)。

我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据

2.为什么要使用会话技术

保存 用户各自(以浏览器为单位) 的数据。

例如:
私有的数据, 购物信息数据保存在会话技术中.

3.常用的会话技术

3.1 cookie

cookie是客户端(浏览器)端的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上.只要不关闭浏览器,再次访问服务器时,会把cookie带到服务器,服务端就会做出响应的处理

3.2 session

session是服务端的技术.服务器为每一个浏览器开辟一块内存空间session.由于内存空间是可每一个浏览器独享的,所有用户在访问的时候,可以把信息保存到session对象中.同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问服务器的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象.

二.Cookie的基本使用

1.cookie的解释

在这里插入图片描述

2.相关的API

  • 创建一个Cookie对象(cookie只能保存字符串数据。且不能保存中文)
    new Cookie(String name,String value);
  • 把cookie写回浏览器
    response.addCookie(cookie); 
  • 获得浏览器带过来的所有Cookie:
    request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
  • cookie的 API
cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value

三.Cookie进阶

1.cookie的分类

  • 会话级别cookie

    默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,cookie就会消失。

  • 持久性cookie
    给cookie设置有效期.

cookie.setMaxAge(int expiry)  :时间是秒

-1:默认。代表Cookie数据存到浏览器关闭(保存在浏览器文件中)。

正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)

0:代表删除Cookie.如果要删除Cookie要确保路径一致。

2.cookie设置有效路径

setPath(String url) ;设置路径

有效路径作用 :

  1. 保证不会携带别的网站/项目里面的cookie到我们自己的项目
  2. 如果路径不一样, cookie的key可以相同
  3. 保证自己的项目可以合理的利用自己项目的cookie

3.cookie的弊端

cookie的大小(个数和自身大小)和格式(只能存字符串)有限制,默认不支持中文,解决中文办法

URLEncode.encode(value,"utf-8");//存入的时候(先通过utf-8编码)
URLDecode.decode(value,"utf-8";//取出 (通过utf-8解码)

四.session

1.session概述

session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所有用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象

生成sessionId, 写给浏览器 都是服务器自动的行为

2.cookie和Session的不同

  • cookie是保存在浏览器端的,大小和个数都有限制。session是保存在服务器端的, 原则上大小是没有限制(实际开发里面也不会存很大大小), 安全一些。
  • cookie不支持中文,并且只能存储字符串;session可以存储基本数据类型,集合,对象等

3.Session的执行原理:基于Cookie的

1、获得cookie中传递过来的SessionId(cookie)

2、如果Cookie中没有sessionid,则创建session对象

3、如果Cookie中有sessionid,找指定的session对象
如果有sessionid并且session对象存在,则直接使用
如果有sessionid,但session对象销毁了,则执行第二步

4.Session的基本使用

4.1 Session的基本用法(作为域对象存取数据)

**范围: 会话(多次请求)**保存用户各自的数据(以浏览器为单位)

request.getSession(); //获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)

Object getAttribute(String name) ;//获取值

void setAttribute(String name, Object value) ;//存储值

void removeAttribute(String name);//移除

4.2 浏览器关闭了, session使用不了, 是session销毁了吗?

没有销毁

使用不了的原因: 不是session销毁, 是sessionId没有了. sessinId保存在Cookie里面的(浏览器里面的), 默认情况下Cookie是会话级别, 浏览器关闭了 cookie就销毁了(sessionId就销毁了), 从而导致session使用不了.

解决: 自己取出sessionId, 自己存到cookie里面去 ,设置有效时长, 写给浏览器就OK

4.3 三个域对象比较

域对象 创建 销毁 作用范围 应用场景
ServletContext 服务器启动 服务器正常关闭/项目从服务器移除 整个项目 记录访问次数,聊天室
HttpSession 第一次调用request.getSession()方法 session过期(默认30分钟)/调用invalidate()方法/服务器异常关闭 会话(多次请求) 验证码校验, 保存用户登录状态
HttpServletRequest 来了请求 响应这个请求(或者请求已经接收了) 一次请求 servletA和jsp(servletB)之间数据传递(转发的时候存数据)
  • 如果是正常关闭服务器,

    把session(内存)序列化到服务器磁盘上,再次启动,把磁盘上的文件反序列化到内存里面

    序列化:对象变成字节序列(以文件形式存在的)的一个过程 内存–>硬盘

    反序列化: 字节序列(以文件形式存在的)变成对象的一个过程 硬盘—>内存

4.4 三个域对象怎么选择?

三个域对象怎么选择?

一般情况下, 最小的可以解决就用最小的.

但是需要根据情况(eg: 重定向, 多次请求, 会话范围, 用session; 如果是转发,一般选择request)

版权声明:本文为weixin_44953728原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44953728/article/details/102639739