Cookie与Session

Cookie

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

Cookie的基本使用

// 创建Cookie对象,并设置数据
Cookie cookie = new Cookie("key","value");

// 发送Cookie到客户端:使用response对象
response.addCookie(cookie);

// 获取Cookie,获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();

// 遍历数组,获取每一个Cookie对象:for

// 使用Cookie对象方法获取数据
cookie.getName();  // 获取键
cookie.getValue(); // 获取值

Cookie的原理分析

对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:

* 响应头:set-cookie
* 请求头: cookie

* 对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据
* 当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据`Set-Cookie:username=zs`
* 浏览器获取到响应结果后,从响应头中就可以获取到`Set-Cookie`对应值`username=zs`,并将数据存储在浏览器的内存中
* 浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加`Cookie: username=zs`发送给服务端BServlet
* Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组
* BServlet通过Request对象获取到Cookie[]后,就可以从中获取自己需要的数据

Cookie的存活时间

默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁

如何将Cookie持久化存储?

设置Cookie存活时间
setMaxAge(int seconds)

参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie

Cookie存储中文

Cookie不能直接存储中文,该如何解决呢?

`URL编码`,如果需要存储中文,就需要进行转码,具体的实现思路为:
1.在AServlet中对中文进行URL编码,采用`URLEncoder.encode()`,将编码后的值存入Cookie中
2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值
3.将获取的值在进行URL解码,采用`URLDecoder.decode()`,就可以获取到对应的中文值

String value = "张三";
value = URLEncoder.encode(value, "UTF-8"); // URL编码
value = URLDecoder.decode(value,"UTF-8");  // URL解码

Session

Session:服务端会话跟踪技术:将数据保存到服务端。

Session的基本使用

// 获取Session对象
HttpSession session = request.getSession();

// 存储数据
session.setAttribute("username","zs");

// 获取数据
Object username = session.getAttribute("username");

// 根据 key,删除该键值对
session.removeAttribute("username");

Session的原理分析

Session是基于Cookie实现的

注意:在一台电脑上演示的时候,如果是相同的浏览器必须要把浏览器全部关掉重新打开,才算新开的一个浏览器。

* demo1在第一次获取session对象的时候,session对象会有一个唯一的标识,假如是`id:10`
* demo1在session中存入其他数据并处理完成所有业务后,需要通过Tomcat服务器响应结果给浏览器
* Tomcat服务器发现业务处理中使用了session对象,就会把session的唯一标识`id:10`当做一个cookie,添加`Set-Cookie:JSESSIONID=10`到响应头中,并响应给浏览器
* 浏览器接收到响应结果后,会把响应头中的coookie数据存储到浏览器的内存中
* 浏览器在同一会话中访问demo2的时候,会把cookie中的数据按照`cookie: JSESSIONID=10`的格式添加到请求头中并发送给服务器Tomcat
* demo2获取到请求后,从请求头中就读取cookie中的JSESSIONID值为10,然后就会到服务器内存中寻找`id:10`的session对象,如果找到了,就直接返回该对象,如果没有则新创建一个session对象
* 关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JSESSIONID的数据,服务端获取到的session就是一个全新的session对象

Session钝化与活化

只要服务器是正常关闭和启动,session中的数据是可以被保存下来的。

钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
    钝化的数据路径为:`项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser`

活化:再次启动服务器后,从文件中加载数据到Session中
    数据加载到Session中后,路径中的`SESSIONS.ser`文件会被删除掉
Session的钝化和活化介绍完后,需要我们注意的是:

* session数据存储在服务端,服务器重启后,session数据会被保存
* 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象
* session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据
* cookie是存储在客户端,是可以长期保存

Session销毁

session的销毁会有两种方式:

  • 默认情况下,无操作,30分钟自动销毁

对于这个失效时间,是可以通过配置进行修改的,在项目的web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <session-config>
        <session-timeout>100</session-timeout>
    </session-config>
</web-app>

如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的

  • 调用Session对象的invalidate()进行销毁
 //1. 获取Session对象
HttpSession session = request.getSession();

// 销毁
session.invalidate();

Cookie和Session的区别

Cookie 和 Session 都是来完成一次会话内多次请求间==数据共享的。

* 区别:
  * 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
  * 安全性:Cookie不安全,Session安全
  * 数据大小:Cookie最大3KB,Session无大小限制
  * 存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
  * 服务器性能:Cookie不占服务器资源,Session占用服务器资源

* 应用场景:
  * 购物车:使用Cookie来存储
  * 以登录用户的名称展示:使用Session来存储
  * 记住我功能:使用Cookie来存储
  * 验证码:使用session来存储

* 结论
  * Cookie是用来保证用户在未登录情况下的身份识别
  * Session是用来保存用户登录后的数据

posted @ 2022-12-01 20:51  晚点心动。  阅读(26)  评论(0)    收藏  举报