当前位置:网站首页>闭关修炼(二十二)session和cookie原理
闭关修炼(二十二)session和cookie原理
2022-06-29 08:11:00 【likeGhee】
简述
cookie和session是开发中常用的记录状态的机制。
相同点:
- 他们两个都可以用来存私密的东西,同样也都有有效期的说法。
- cookie和session都是用来跟踪浏览器用户身份的会话方式。
不同点:
- cookie数据保存在客户端,session数据保存在服务器端。
- session是放在服务器上的,过期与否取决于服务器的设定,cookie是存在客户端的,过期与否在cookie生成的时候设置进去,也可以自己清理掉。
- 从服务器角度来看,cookie不能跨浏览器查询,session可以跨浏览器查询(sessionid传值)
运用:
cookie是不很安全的,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE ;
所以我们可以将登陆信息等重要信息存放为seesion;其他信息如果需要保留可以放在cookie中。
cookie是什么:
- cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。
session是什么
- Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。
cookie
如何创建cookie
添加cookie
@WebServlet("/addCookie")
public class AddCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("name", "likeghee");
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("添加cookie成功");
}
}
调用一下接口
F12查看响应头能看到Set-Cookie
如何获取cookie
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(cookie.getName() + "--" +
cookie.getValue() + "|||||");
}
}
}
调用getCookie接口
F12查看network,我们可以看见客户端又通过请求头将cookie传给服务器端,所以为什么服务器可以通过req.getCookies();获取到浏览器的cookie
谷歌浏览器可以点击感叹号查看本地的cookie有哪些
cookie原理
创建cookie流程:
- 客户端调用addCookie接口
- 服务端使用响应头将cookie信息返回给客户端
- 客户端获取服务器创建cookie信息保存到本地
获取cookie流程:
- 客户端调用getCookie接口
- 客户端使用请求头将cookie信息发送给服务端
- 服务器就可以通过req.getCookies();获取cookie信息
每次请求浏览器将cookie放入请求头,服务器从请求头获取cookie信息
session
如何创建session
@WebServlet("/addSession")
public class AddSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 默认为true,获取session,如果session不存在,就新建一个
// 获取session,如果session不存在,则返回null
HttpSession session = req.getSession(true);
session.setAttribute("name", "likeghee");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("添加session成功");
}
}
调用接口后,我们去看cookie
当前网站的cookie中多了一个JSessionId
如何获取session
@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 默认为true,获取session,如果session不存在,就新建一个
// 获取session,如果session不存在,则返回null
HttpSession session = req.getSession(false);
String name = (String) session.getAttribute("name");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(name);
}
}
F12查看请求头,客户端将sessionID传给了服务端
session原理
添加session:
- 客户端调用add接口,服务器调用req.getSession(true);服务器创建session
- 服务器通过响应头将sessionId返回给客户端
获取session:
- 客户端将本地的sessionId放入到请求头调用get接口
- 服务器调用req.getSession(false);服务器使用请求头中的sessionId去找到对应的值
边角料
我们可以看到sessionId的到期时间是浏览器关闭时,所以浏览器关闭,客户端再去调用get接口,服务器将无法从请求头中获取sessionId,也就无法获取到值。
同样的换一个浏览器也是查不到结果的,因为session的使用,用的是cookie的原理
为什么添加时getSession(true),而获取时getSession(false)?
如果我们将获取时的false改为true,客户端调用get接口,如果请求头没有sessionId,那服务器会创建session,这不是我们希望的,创建session应该是在add接口时使用
如果浏览器禁用了cookie,如何使用session呢?
sessionId就不通过cookie传递,使用缓存文件,我们自己用GET/POST表单将sessionId在服务器与客户端之间传递
session的值是存放在jvm中的,所以重启服务器,session值将会被销毁,一般做法是将值缓存到redis当中
集群session共享问题?
如何解决发布版本失效问题?
边栏推荐
- ES6 data type map & set
- Memoirs of actual combat: breaking the border from webshell
- 表格背单词的方法
- 关于#sql#的问题:创建一个名为View_XB视图,功能是①如果有重名的视图先删除后创建②显示XSB表中本班级的男女生各有多少人,并添加检查约束
- The final of the sixth season of 2022 perfect children's model Hefei division came to a successful conclusion
- Feature selection: maximum information coefficient (MIC) [used to measure the degree of correlation between two variables X and y, linear or nonlinear strength, commonly used for feature selection of
- Voice annotation tool: Praat
- 802.11--802.11n协议 PHY
- P6776-[NOI2020]超现实树
- 目标跟踪【单目标跟踪(VOT/SOT)、目标检测(detection)、行人重识别(Re-ID)】
猜你喜欢
随机推荐
十大券商账号开户安全吗?是靠谱的吗?
壁纸小程序源码双端微信抖音小程序
Standard | China payment and clearing Association releases the first privacy computing financial specification
Measure the level of various chess playing activities through ELO mechanism
网上开股票账户真的安全吗?求答案
P4769-[noi2018] bubble sort [combinatorics, tree array]
Voice annotation automatic segment alignment tool sppas usage notes
人民链鲍大伟:打破壁垒,建立全域数据治理共享及应用平台
P6776-[NOI2020]超现实树
Application of mediastreamer2 and GStreamer in embedded field
NP3 formatted output (I)
特征选择:最大信息系数(MIC;Maximal Information Coefficient)【用于衡量两个变量X和Y之间的关联程度,线性或非线性的强度,常用于机器学习的特征选择】
Notes mosaïque
hugetlbfs的写时复制
新版付费塔罗牌测算源码 (附带搭建教程)
微信小程序开发,如何添加多个空格
Actual combat memoir starts from webshell to break through the border
智能硬件evt dvt pvt mp
New spark in intelligent era: wireless irrigation with Lora wireless transmission technology
关于SQL语句的大小写


![[microservices openfeign] timeout of openfeign](/img/b1/9bc92250b4d544c704d2af5c08d059.png)
![[hcie TAC] question 5-2](/img/a5/308aa2cced4cba59354c576a07e3c0.jpg)




