首先,我们先了解什么是会话,再来说说什么是Cookie和Session:
会话技术: 所谓的会话过程就是指从打开浏览器到关闭浏览器的过程,在一次会话中包含了多次请求和响应。
例如一次会话的过程:打开一个web页面进行浏览,点击页面中多个超链接,访问了多个Web资源,然后关闭浏览器,整个过程就为一个会话。功能:在一次会话的范围内的多次请求间,共享数据。实现方式: Cookie:客户端会话技术。作用:将数据保存到客户端。Session:服务器端会话技术。作用:在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。接下来我们说说为什么要使用Cookie和Session:
我们在前面servlet学习知道,http是无状态的协议,我们在客户端每次读取web页面时,服务器都打开新的会话,但是服务器无法确定这次请求和上次的请求是否来自同一个客户端,也不会自动处理客户多次请求之间的信息和联系。在这个时候,我们利用Session和Cookie就可以让服务器知道不同的请求是否来自同一个客户端。好比如说我们要在某宝的购物车添加或删除商品,但购物页面是一个服务器端的共享空间,当别人去购买东西时,也把商品添加到购物车,这时这个购物车相当于共有的东西,你去购物车结算的时候,就包括了自己和别人共同的东西。因此就需要使用到Cookie和Session技术去解决这个问题,来保存多个用户访问服务器产生了各自的数据。
一、Cookie技术:
先举个例子:例如我要在某宝网页上买一部手机,我选好了要把它加入购物车,这个时候服务器就会把手机这个对象存入了已经开辟好的Cookie空间中, Cookie空间会为这个手机对象绑定一个唯一的标识,然后以响应头方式返回给客户端。因为Cookie域保存在自己浏览器内部,与别人互不干扰,所以这个标识会保存在这个浏览器客户端中。当我去购物车去下单的时候,服务器就会从浏览器中把这个唯一标识以请求头的方式重新存入到Cookie空间,同时为它绑定唯一的标识。这样子就可以避免多个用户之间所产生的信息造成混乱。但因为是客户端技术,所以安全性并不高。
Cookie技术的特点:
Cookie存储数据在客户端浏览器。浏览器对于单个Cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)。Cooike快速入门(这里分成两个项目来执行):
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * * Cookie快速入门,要转去CookieDemo2实践(先实践当前这个,再实践CookieDemo2) * 使用步骤: 1. 创建Cookie对象,绑定数据 * new Cookie(String name, String value) 2. 发送Cookie对象 * response.addCookie(Cookie cookie) 3. 获取Cookie,拿到数据 * Cookie[] request.getCookies()*/ @WebServlet("/cookieDemo1") public class CookieDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建Cookie对象 Cookie c = new Cookie("msg","hello"); //2.发送Cookie response.addCookie(c); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } } import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * * Cookie快速入门 * */ @WebServlet("/cookieDemo2") public class CookieDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //3. 获取Cookie Cookie[] cs = request.getCookies(); //获取数据,遍历Cookies if(cs != null){ for (Cookie c : cs) { String name = c.getName(); String value = c.getValue(); System.out.println(name+":"+value); } } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }二、Session技术:
这个和Cookie一样,同样去买一部手机,这个时候就会把手机这个对象存入已经开辟的Session空间中, Session空间为此对象生成一个唯一的Key值,因为Session域同样保存在自己浏览器内部,与别人互不干扰,所以这个Key值也会保存在这个浏览器客户端中。当我去购物车去下单的时候,服务器就会从浏览器中把这个Key值存入到Session空间中,同时为它绑定唯一的Key值。相较于Cookie而言Session技术是服务器技术,较为安全。
session的特点:
session用于存储一次会话的多次请求的数据,存在服务器端session可以存储任意类型,任意大小的数据Session快速入门(这里分成两个项目来执行):
/** * * session快速入门,此处要转去SessionDemo2实践(先实践当前这个,再实践SessionDemo2) * 方法: 1. 获取HttpSession对象: HttpSession session = request.getSession(); 2. 使用HttpSession对象: Object getAttribute(String name) void setAttribute(String name, Object value) void removeAttribute(String name) 3. 原理: * Session的实现是依赖于Cookie的。 */ 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("/sessionDemo1") public class SessionDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用session共享数据 //1.获取session HttpSession session = request.getSession(); //2.存储数据 session.setAttribute("msg","hello session"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } } 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("/sessionDemo2") public class SessionDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用session获取数据 //1.获取session HttpSession session = request.getSession(); //2.获取数据 Object msg = session.getAttribute("msg"); System.out.println(msg); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }总结:
Session与Cookie的区别:
session存储数据在服务器端,Cookie在客户端;session没有数据大小限制,Cookie有;session数据安全,Cookie相对于不安全的区别: