会话跟踪技术Cookie和 session

会话跟踪技术Cookie和 session

会话跟踪技术之什么是Cookie

简介:介绍web开发核心技术之Cookie介绍和使用

cookie介绍
  • 背景:HTTP协议作是无状态协议,无状态指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。存在这样的问题,既然无状态,那完成一套完整的业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同个浏览器操作呢?
  • 解决方案:
    • 浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID和response一并返回给浏览器
    • 服务器在本地创建一个map结构,专门以key-value存储这个ID标识和浏览器的关系
    • 当浏览器的第一次请求后已经分配一个ID,当第二次访问时会自动带上这个标识ID,服务会获取这个标识ID去map里面找上一次request的信息状态且做对应的更新操作服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是cookie;服务器创建的那个map结构就是session。
    • cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送。
    • session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态
    • 核心:它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。浏览器查看多个站点的cookie
cookie的属性
  • Name:名称
  • Value:值
  • Domain:表示当前cookie所属于哪个域或子域下面
  • Expires/Max-age:表示了cookie的有效期,是一个时间,过了这个时间,该cookie就失效
  • Path:表示cookie的所属路径。
  • size:大小,多数浏览器都是4000多个字节
  • http-only:表示这个cookie不能被客户端使用js读取到,是不公开的cookie
    • (chrome调试器的console中输入document.cookie将得不到标记为HttpOnly的字段
  • ecure:标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端,
    • 从Chrome52和Firefox52开始,不安全的站点(http:)无法使用Cookie的 Secure标记
  • SameSite(特有的,可以忽略)
Cookie的缺陷
  • cookie会被附加在每个HTTP请求中,增加了流量。
  • 在HTTP请求中的cookie是明文传递的,所以安全性成问题,除非用HTTPS
  • Cookie的大小有限制,对于复杂的存储需求来说不满足
  • cookie泄露
Cookie的现状:
  • 浏览器允许每个域名所包含的cookie数量?
  • 多数浏览器允许最多是50个,部分浏览器是30或者20;
  • 满后会有多种剔除策略,比如LRU,权重等
  • Cookie曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段
  • 现代浏览器开始支持各种各样的存储方式,Cookie渐渐被少用了,新的浏览器API已经允许开发者直接将数据存储到本地,比如localStorage、SessionStorage等参考:https://developer.mozilla.org/zhCN/docs/Web/HTTP/Cookies

javaweb开发核心之Cookie实战

javaweb操作浏览器器cookie

获取请求的cookie

Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
	cookie.getDomain();
}
private final String name;
private String value;
private int version = 0; // ;Version=1 ... means RFC 2109 style
//
// Attributes encoded in the header's cookie fields.
//
private String comment; // ;Comment=VALUE ... describes cookie's use
private String domain; // ;Domain=VALUE ... domain that sees cookie
private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
private String path; // ;Path=VALUE ... URLs that see the cookie
private boolean secure; // ;Secure ... e.g. use SSL
private boolean httpOnly; // Not in cookie specs, but supported by browsers
响应返回cookie
Cookie cookie = new Cookie("token","sfwerawefewadaewfafewafa");
//20秒过期时间,过期后不不会⾃自动携带过去
cookie.setMaxAge(20);
response.addCookie(cookie);
request.getRequestDispatcher("/index.jsp").forward(request,response);
  • js获取cookie,可以获取token,但是获取不到JSESSIONID,因为 http-only原因

Web开发必备知识之Session会话

web开发Session知识

什么是Session
  • 背景:HTTP协议作是无状态协议,无状态指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。
  • 存在这样的问题,既然无状态,那完成一套完整的业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同个浏览器操作呢?
  • cookie和session都是为了弥补http协议的无状态特性,对server端来说无法知道两次http请求是否来自同一个用户,利用cookie和session就可以让server端知道多次http请求是否来自同一用户
生成和使用流程(和Cookie知识点一样,两者互相配合)
  • 浏览器第一次发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识sessionld和response一并返回给浏览器
  • 服务器在本地创建一个map结构,专门以key-value存储这个sessionld和浏览器的关系
  • 当浏览器的第一次请求后已经分配一个sessionld,当第二次访问时会自动带上这个标识sessionld
  • 服务器通过查找这个sessionld就知道用户状态了,并更新sessionld的最后访问时间。
  • 注意:Session是有时限性的:比如如果30分钟内某个session都没有被更新,服务器就会删除这个它。·
总结:
  • 服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是cookie;

  • 服务器创建的那个map结构就是session。

  • cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送。

  • session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态o总言之cookie是保存在客户端,session是存在服务器,session依赖于cookie

  • cookie里面存储的就是JSESSIONID

使用场景:记录用户的登录状态、权限等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zHyBdpH-1615432460413)(C:\Users\阮相歌\AppData\Roaming\Typora\typora-user-images\image-20210310170427596.png)]

session的现状
  • session是存储在服务端的内存中,在javaweb里面叫HttpSession也是一个作用域
  • PageContext(页面)->ServletRequest(请求)>【HttpSession】(会话)->ServletContext(一个应用)
  • 是可以存储很多key-value的,作用域比较广,所以也不能存储过多内容,因为内存是有限制的,互联网企业使用比较少,传统IT公司使用比较多
知识延申
  • 服务端是单机情况下session是可以很用的使用的,但是分布式(多台机器)情况下就存在不能共享的问题。
  • 用户A在当前机器登录,突然某次请求到B机器,由于B服务器不存在这个用户的登录信息,所以就会提示重新登录
  • 这个场景下就用到分布式存储方案-比如Redis

javaweb会话技术HttpSession用户登录实战

讲解HttpSession知识开发用户登录实战

HttpSession 类操作api介绍:
HttpSession session = request.getSession();
//获取sessionid, java⾥⾯叫jsessionid
System.out.println("sessionid="+session.getId());
//创建时间戳,毫秒
System.out.println("getCreationTime="+session.getCreationTime());
//是否是初次创建,记得情况浏览器器的cookie,验证sessionid
System.out.println("isNew="+session.isNew());
//往session存储东⻄西
session.setAttribute("name","你好世界");
登录Servlet实战
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
    if(name.equals("123") && pwd.equals("123")){
	User user = new User();
	user.setId(121);
	user.setName(name);
	user.setHost("123");
	req.getSession().setAttribute("loginUser",user);
	req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req,resp);
}else{
req.setAttribute("msg","账号密码错误");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
登录
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/loginServlet" method="post">
名称: <input type="text" name="name"/>
<br/>
密码: <input type="password" name="pwd"/>
<input type="submit" value="登录">
消息提示 ${msg}
</form>
</body>
</html>
登录成功页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
id:${loginUser.id}
<br>
name:${loginUser.name}
<a href="/logout_servlet">退出</a>
</body>
</html>
  • 退出登录实现方式: session.invalidate();
  • 过期时间配置web.xml,单位分钟
<session-config>
	<session-timeout>30</session-timeout>
</session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值