Cookie与Session一些基础知识
首先,我们先了解什么是会话,再来说说什么是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相对于不安全的区别: