网站首页 > 技术文章 正文
Cookie和Session
接口请求(HTTP请求)是无状态的,每次请求都是完全独立的。也就是说,在处理请求时,Web应用服务器无法得知这个请求是哪个用户发送的,无法跟踪上一次请求的状态。但是,有些时候接口请求需要记录一些状态,例如,在服务器处理接口A时,需要检查请求用户是否已经登录,而登录接口是接口B。对于这类问题,一般使用Cookie和Session解决。
1.Cookie
Cookie是解决接口请求无状态问题的有效手段,后端应用程序可以在响应报文的Header信息中添加Set-Cookie属性,当客户端(一般是浏览器)接收到响应报文时,会记录Set-Cookie的值,当下次发送请求时,会自动地把SetCookie的值放到请求报文里。也就是说,接口请求的状态(如用户登录标识)可以存放在客户端,客户端请求时会主动携带这些状态。Cookie的工作原理如图4.57所示。
注意:客户端自动保存Cookie是不绝对的,如果浏览器设置了阻止Cookie的话,Cookie是不会自动被保存的。前端页面需要提示用户解除“阻止Cookie”(如果用户阻止了Cookie的话)。另外,在客户端自动保存Cookie的情况下,不同域名会有不同的存储空间,A域名的Cookie是不会自动填到B域名的请求中的。
在以Spring Boot为基础框架的后端应用程序中,向响应报文的Header信息中添加Set-Cookie属性的代码如代码4.27所示,其中,代码中的函数为Controller层中的接口的入口函数,xxx是Cookie的名,yyy是Cookie的值。
代码4.27 后端应用程序添加Cookie信息
…
@Controller
…
@RequestMapping(value="/test",method = RequestMethod.POST)
@ResponseBody
public JSONObject create(@RequestBody String requestParam, HttpServlet
Response response) {
…
//向响应报文的Header信息中添加Set-Cookie属性
response.addCookie(new Cookie("xxx", "yyy"));
…
}
…
另外,后端应用程序从请求报文的Header信息中获取Cookie值的代码如代码4.28所示,其中,代码中的函数为Controller层中的接口的入口函数,@CookieValue("xxx")表示通过注解自动寻找xxx对应的Cookie值。
代码4.28 后端应用程序获取Cookie信息
…
@Controller
…
@RequestMapping(value="/test",method = RequestMethod.GET)
@ResponseBody
public JSONObject get(HttpServletRequest request, @CookieValue("xxx")
String yyy) {
…
}
…
“以Cookie的方式解决请求无状态问题”有一个很严重的缺陷,那就是安全性的问题,如客户端可以伪造登录信息等。因此,状态信息不能只存在客户端上,服务器上也需要想办法保存状态信息。
2.Session
Session是服务器记录状态信息的手段,后端应用程序可以建立一个Session(会话,其实就是一片存储空间),并向Session中存放一些状态信息(如用户ID、用户权限标识等),Web应用服务器软件会对应创建一个Session对象和生成对应的Session ID,并且将其存放到公共的Session存储空间当中。当请求处理结束时,Web应用服务器会自动将Session ID添加到响应报文的Header信息的Set-Cookie属性当中。客户端(一般是浏览器)接收到响应报文后,会自动保存Session ID,当下次发送请求时,会自动把Session ID放到请求报文当中,服务器接收到请求后,后端应用程序就可以根据Session ID获取到对应的会话信息了。
注意:虽然Session信息保存在服务器上,但是Session是不能脱离Cookie而单独使用的。因为后端应用程序需要Cookie信息中的Session ID才能获取对应的Session信息。
如果后端应用程序需要使用Session的话,是不需要手动设置或获取Header信息的(自动完成),只需要操作Session即可。添加Session值和获取Session值的代码如代码4.29所示,其中,代码中的函数为Controller层中的接口的入口函数,aaa是Session信息的名,bbb是对应的值。
代码4.29 后端应用程序操作Session
…
@Controller
…
@RequestMapping(value="/test",method = RequestMethod.POST)
@ResponseBody
public JSONObject create(@RequestBody String requestParam, HttpServlet
Request request) {
…
//设置Session信息
request.getSession().setAttribute("aaa", "bbb");
//获取Session信息
String sessionValue = request.getSession().getAttribute("aaa");
//删除Session信息
request.getSession().removeAttribute("aaa");
…
}
…
另外,由于Session本质上只是保存在服务器上数据,而不能跟踪用户的连接情况,所以在一般情况下,都需要设置一个Session过期时间。在使用Spring Boot框架的后端应用程序当中,Session过期时间的设置在配置文件(默认是application.properties)当中,如代码4.30所示。
代码4.30 在配置文件中设置Session过期时间
#设置Session过期时间为1小时
server.servlet.session.timeout=3600s
3.Cookie和Session的使用场景
由于Cookie的安全性不高,所以一般不单独使用Cookie。而Session一般用作用户信息的记录,如是否已登录、用户ID、用户权限等。利用Session,可以帮助接口做用户鉴权。
本文给大家讲解的内容是大型网站架构的技术细节:后端架构规整化Cookie和Session
- 下篇文章给大家讲解的内容是大型网站架构的技术细节:后端架构规整化应用拆分和协调
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持
猜你喜欢
- 2025-04-09 如何设计一套单点登录系统(如何做单点登录)
- 2025-04-09 nginx 前端到底用来做啥(前端放在nginx)
- 2025-04-09 一文助你弄懂cookie、session、token
- 2025-04-09 简单快速搭建一个大模型agent前端
- 2025-04-09 对API网关注册和接入的接口安全管理总结
- 2025-04-09 初识.Net Core Mvc(session 登录+查询)
- 2025-04-09 springcloud实现分布式session(springcloud分布式事务解决方案)
- 2025-04-09 前端开发中实现有效缓存策略的关键要点
- 2025-04-09 Nginx负载均衡中对session处理分析一
- 2025-04-09 SpringBoot springsession redis(springboot整合redisson)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)