Cookie
会话
会话是在一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止
会话作用
由于Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解,不能共享数据
用于存储浏览器与服务器在请求和响应过程中产生的数据
会话技术
客户端会话技术:Cookie
服务器端会话技术:Session
Cookie
在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)
使用步骤
- 创建Cookie对象
new Cookie(String name,String value)- 发送Cookie对象
response.addCookie(Cookie cookie)- 获取Cookie
Cookie[] request.getCookies()- 遍历数组
使用for循环遍历,获取每一个Cookie
代码实现
/**
* @author lifly
* @date 2021/6/14 0014 9:20
*/
@WebServlet("/setServlet")
public class SetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie对象,设置数据
Cookie cookie = new Cookie("name", "tom");
//通过response,响应(返回)cookie
resp.addCookie(cookie);
}
}
/**
* @author lifly
* @date 2021/6/14 0014 9:20
*/
@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过request对象,接收cookie数组
Cookie[] cookies = req.getCookies();
//遍历数组
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+":"+value);
}
}
}
}
服务器发送多个Cookie
//创建多个cookie对象
Cookie cookie1 = new Cookie("name", "jack");
Cookie cookie2 = new Cookie("age", "18");
//通过response响应多个
resp.addCookie(cookie1);
resp.addCookie(cookie2);
Cookie在浏览器保存的时间
默认情况下,浏览器关闭Cookie销毁,但是可以设置Cookie的存活时间
相关方法
setMaxAge(int second)设置存活时间,单位:秒
正数:指定存活时间,持久化浏览器的磁盘中,到期后自动销毁
负数:默认浏览器关闭,cookie销毁
零:立即销毁(自杀)
代码演示
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie对象,设置数据
Cookie cookie = new Cookie("name", "tom");
//设置cookie存活时间
cookie.setMaxAge(-1);//浏览器关闭,cookie销毁
cookie.setMaxAge(60);//存活60秒,到期自动销毁
cookie.setMaxAge(0);//立即销毁
//通过response,响应(返回)cookie
resp.addCookie(cookie);
}
Cookie存储中文
- tomcat8之前
cookie中不能直接存储中文数据,需要将中文数据转码–一般采用URL编码
2.tomcat8之后
cookie支持中文数据,特殊字符还是不支持,建议使用URL编码存储,URL编码解析
相关方法
URLEncoder.encode(String s,String enc);按照指定的编码对s进行URL编码
URLDecoder.decode(String s,String enc);按照指定的编码对s进行URL解码
代码演示
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookies数组
Cookie[] cookies = req.getCookies();
//遍历数组
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
//对name解码
URLDecoder.decode(name,"UTF-8");
System.out.println(name+":"+value);
}
}
我安装的tomcat是8.5.59,能存储中文,但是存储的中文中不能有不允许使用 分号、空格、逗号等一些特殊符号…;如果是正常的存储中文的话没有问题,如果是存储特殊符号等机会报错,例如下面代码:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("product", "nove4");
String value = "华为p40 华为nove8";
String encode = URLEncoder.encode(value, "utf-8");
Cookie cookie1 = new Cookie("pro", value);
resp.addCookie(cookie);
resp.addCookie(cookie1);
}
在存储cookie的时候不会报错,但当我存户cookie1的时候,在浏览器访问的时候会报以下错误
Cookie的特点与作用
特点
cookie存储数据在客户端浏览器
浏览器对于单个Cookie的大小有限制(4kb)以及对同一个域名下的cookie数量有限制(50个)
浏览器可以存储cookie的总数量为300个
作用
cookie一般用于存储少量的不太敏感的数据
在不登录的情况下,完成服务器对客户端的身份识别
缺陷
- 不太安全
- cookie存储中文,比较麻烦(编码解码)
- cookie的value是String类型的,一个cookie只能存储一个数据,如果需要存储多个数据,就得创建多个cookie
- 一个站点对cookie是有限制
cookie的存储的内容限制在4kb之内
一台服务器在一个客户端最多保存50个cookie
一个浏览器最多可以存储300个cookie- 设计问题
cookie是浏览器与服务器之间数据交互的凭证。如果客户端把cookie给清除掉了,服务器就获取不到数据
一般来说,我们只会把数据存储到服务器即可