目录
Cookie
Cookie定义
Cookie是浏览器提供持久化存储数据的机制。
Cookie数据的来源
Cookie中的数据通过服务器发送给浏览器的。
其中返回的响应中有 Set-Cookie这个部分,这就是服务器给浏览器的Cookie。
Cookie数据的存储
Cookie数据会存储在主机的硬盘中。数据根据域名来分类存放。
Cookie数据的使用
当浏览器访问之前访问过的服务器之后,就会把在本地保存的Cookie数据读取出来放到请求报文的头部中,这样当服务器收到后,就可以知道这个客户端之前已经连接过了,都和它发生了什么。
使用Cookie原因
由于HTTP协议是无状态(客户端和服务器之间的每次通信之间没有任何的关系)协议,但是这又不符合平时的情景。当用户登录后,下次再次登录就需要判断用户之前是否登录过。
服务器所要服务的客户端有很多,当有了Cookie后,不同的客户端发送给服务器的请求有了Cookie加持后,就会让服务器少做很多重复性的工作,大大减轻了服务器的负担。
Session
Session定义
Session是服务器提供持久化存储数据的机制。
服务器收到的请求有很多,这些请求中有些是带有Cookie的请求。但是如何识别验证Cookie的,就是通过服务器存储的Session来验证的。
如何存储数据
Session的本质是类似于一个哈希表的结构。
Key:令牌ID(sessionId/token)
Value:用户信息(服务器自己设置),用户信息也是类似于哈希表的结构。
从session角度看:sessionId是服务器自己生成的一个“唯一的字符串”
从整个登录流程来看:这个sessionId叫做token
Cookie和Session的区别
Cookie和Session的关联就是在网页登录的时候配合使用。
区别:
1、cookie是客户端的存储机制;session是服务器的存储机制。
2、cookie中存储的信息可以是多种多样的;session就是专门用来保存用户信息的。
3、cookie和浏览器是强相关的,可以不是在登录(不和session搭配)情况下单独使用;
session可以在其他地方使用,比如手机APP登录时(不和cookie搭配使用)和其他搭配使用。
4、cookie属于HTTP协议中的一部分;session和HTTP协议无关。
使用Cookie和Session简单实现登录页面
package login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取session,有则获取并创建对象,无则啥也不干
// 如果有cookie,则通过cookie中的sessionId来查对应的value,然后获取到session对象
HttpSession httpSession = req.getSession(false);
if (httpSession == null) {
System.out.println("用户未登录!");
resp.sendRedirect("login.html");
return;
}
String userName = (String)httpSession.getAttribute("userName");
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("欢迎" + userName + "回来");
}
}
package login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 提前把req设置成utf8,否则当用户输入的是中文会出现bug
req.setCharacterEncoding("utf8");
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
// 验证账户和密码是否正确
// 这里用户只有 张三 123
if (!userName.equals("张三")) {
System.out.println("用户名错误!");
resp.sendRedirect("login.html");
return;
}
if (!passWord.equals("123")) {
System.out.println("密码错误!");
resp.sendRedirect("login.html");
return;
}
// 登陆成功
// 创建一个session
HttpSession httpSession = req.getSession(true);
// 创建完session后同时也把cookie也创建好了
// 同时返回时把sessionId返回给浏览器
httpSession.setAttribute("userName", userName);
resp.sendRedirect("index");
}
}
抓包:
有什么错误评论区指出。希望可以帮到你。