会话跟踪技术-Cookie & Session

目录

概述

 封装发送 Cookie

 获取客户端请求时携带的cookie

 Cookie原理

Cookie的生命周期

 Cookie存储中文说明(URL编码介绍)

Session

存储和读取数据

 Session的钝化和活化

Session的销毁(生命周期)

Cookie 和 Session的对比


概述

要想了解会话跟踪技术,我想我们要先了解一下会话是什么,以及会话跟踪技术存在的意义。

首先我们要说的是:会话。

 会话 见名知意,在现实中我们能想到的是两个人之间的对话,但在web中,对话的两个对象就应该是客户端和服务端,也就是两者产生了连接之后,就产生了会话,直到一端中断此会话,会话结束。值得注意的是:一次会话期间客户端可以发送多个请求给服务端,也就是可以访问多次资源。

 出现的问题 由上我们知道,一次会话可以发送多次请求,但是如果我们使用的是HTTP协议进行资源的传输,那么多次请求之间是无法进行数据共享的。因为HTTP协议是无状态的,也就是无论我们向服务器发送多少次请求,服务器都会认定为是第一次请求。为了解决多次请求之间的数据共享问题,我们引入了会话跟踪技术。

会话跟踪一种维护浏览器状态的方法,它可以帮助服务器识别多次请求是否来源于同一浏览器,以便实现同一会话中的不同请求之间的数据共享

会话跟踪的技术实现

1.客户端会话跟踪技术:Cookie

2.服务端会话跟踪技术:Session

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

用处:例如当我们第一次访问某服务器时,服务器会发送给我们一个kookie,kookie中存放着一些数据,浏览器将次cookie保存,当我们再次访问次服务器时就会携带保存的cookie,服务器会读取我们我们请求中的kookie,做一些事情。

 我们作为后端,也就是服务器端,就要知道kookie的封装、发送和读取的方式。

 封装发送 Cookie

在此使用boot工程进行测试,不用boot工程也是没问题的,使用response.addCookie()将创建好的cookie影响出去就行。

@GetMapping
public String cookieTest(HttpServletResponse response){
    //创建cookie
    Cookie cookie = new Cookie("name", "Tom");
    //发送cookie
    response.addCookie(cookie);
    return "send...ok";
}

使用postman进行接口测试:

访问后是可以看到cookie发送成功的 

 获取客户端请求时携带的cookie

@PostMapping
public String cookieTest1(HttpServletRequest request){
    Cookie[] cookies = request.getCookies();
    String name = cookies[0].getName();
    String value = cookies[0].getValue();
    System.out.println("cookieName:" + name + ",value:" + value);
    return "OK";
}

结果成功打印请求携带的cookie: 

 Cookie原理

Cookie的实现是基于HTTP协议的 ,cookie存在于请求头中,查看请求头信息:

会看到cookie的身影。

 Cookie由服务器发送给客户端,客户端访问的时候会携带cookie。

 

Cookie的生命周期

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

我们可以设置Cookie的生命周期,设置方式:

setMaxAge(int seconds) --seconds设置存储时间,单位为秒

参数:正数:将cookie写入磁盘,持久化存储,到期自动删除

           负数:默认值,浏览器关闭,cookie销毁。

               零:删除对应cookie。

 Cookie存储中文说明(URL编码介绍)

Cookie不能直接存储中文,会出现乱码问题, 解决:URL编码和解码

在进行Cookie的发送的时候,将中文数据进行URL编码后发送。

在获取Cookie的时候,进行RUL解码操作,获取到中文的Cookie数据。

 如下图:以%符号包裹着十六进制就是进行了URL编码后的字符串格式。其原理呢就是将我们的中文字符转为二进制后再转为十六进制加上%包裹而成。

乱码过程:在web传输过程中,实际上是以URL编码后的字符串格式进行传输的,我们在创建cookie发送后,实际上是自动将数据以utf-8字符集进行RUL编码,到Tomcat后以ISO8859-1字符集进行RUL解码操作,两者使用的字符集不一致,导致乱码。

解决:

所以我们可以手动的将字符集进行设置就可以解决次问题。

一般使用cookie也不会使用中文,所以了解即可。

如果想了解URL编码,Java给我们提供了相应工具类:

参考使用如下:

 

Session

 服务器端会话跟踪技术,数据存储在服务端。Session的实现是基于Cookie的。

作用 

可以使用session作登录的"记住账号密码"功能,session的数据存储在服务器,更安全,当用户访问登录页面,获取用户session中数据,自动填写登录。

 关于Session的方法:

1.setAttribute(String name,Object obj):存储数据到session域中。

2.getAttribute(String name):根据name获取对应值。

3.removeAttribute(String name):根据name删除该session。

存储和读取数据

下面进行测试,不必在意测试写法,只需关注如何创建session,存储数据和获取数据即可。 (在表现层使用HttpServletRequest对象调用方法就可以)

@PutMapping
public String sessionTest(HttpServletRequest request){
    //创建session并存储数据
    HttpSession session = request.getSession();
    session.setAttribute("name","Tom");
    return "OK";
}

@DeleteMapping
public String sessionTest1(HttpServletRequest request){
    //获取session
    HttpSession session = request.getSession();
    Object name = session.getAttribute("name");
    System.out.println(name);
    return "OK";
}

 测试结果

结果说明:看红框内数据就好,上面的是cookie测试的结果。

session过程:我们看到name和value是不可看到的,因为使用session,数据是存储在服务器的,返回来的相当于一个"钥匙",当我们使用这把"钥匙"去访问服务器,就会进行匹配,匹配成功就可以获取数据。由此可推出一个结论:session的数据存储是更安全的

 Session的钝化和活化

 我们知道,session的数据是存储在服务器内存中的,但是有个问题,如果服务器重启,session存储的数据是否还存在?

要说明这个问题,就要提到两个概念:钝化和活化

钝化:服务器正常关闭时,Tomcat会自动将session存储的数据写到磁盘中。

活化:服务器再次启动时,会读取磁盘中的数据到session中。

钝化过程:正常关闭时,Tomcat会自动将Session数据序列化后保存到Session.ser文件中,再次启动服务器时,会重新读取数据。将Session.ser文件删除。

Session的销毁(生命周期)

自动销毁(到期时间)

我相信大家一定有过这样的经历:在某页面操作时,如果在页面待久了未操作,然后点击某按钮或刷新,就会出现类似"登录超时,请重新登录"的提示。这是为什么呢?就是因为Session到期了。你发送的请求被服务器认为是新请求,所以需要重新登录获取操作权限。

在Tomcat中,Session默认到期时间是30分钟。

 设置session到期时间的方式有许多种:

1.如果使用的是springboot,可以到application.propertis文件中设置:

server.servlet.session.timeout = 1800   (单位为秒)

 2.也可以到web.xml中设置:

<session-config>

<session-timeout>30</session-timeout> (单位为分钟)

</session-config>

3.在编码中通过方法调用的方式:

session.setMaxInactiveInterval(60*30); (单位为秒)

 以上情况都是到期后自动销毁。

手动销毁session

调用方法:

session.invalidate();

Cookie 和 Session的对比

两者都是为了解决HTTP协议的无状态的特性,也就是处理一次会话多次请求之间的数据共享的。

两者区别:

1.存储位置:Cookie存储在客户端,Session存储在服务器端。

2.安全性:Cookie不安全,Session安全。

说明:到浏览器可以查看浏览器存储的所有Cookie,数据并不安全。

3.存储容量:Cookie最大3KB,Session对存储大小没有限制。

说明:由于Session数据存储在服务器,数据存在太大对于服务器也会是个负担。

4.到期时间:Cookie可以长期存储,Session默认为30分钟。

对于两者的使用,主要需要考虑安全性和到期时间后选择。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mao.O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值