客户端会话技术——Cookie
前言
本文简单的介绍了Cookie会话技术的相关知识点,适合初学者入门
一、状态管理Cookie会话技术(客户端)
1.1 状态管理概述
1.1.1 为什么需要状态管理?
- Web应用程序使用HTTP协议通信,而HTTP协议是”无状态”协议,即服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的下一次请求将重新建立网络连接。
- 服务器应用程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品。因此,有必要跟踪同一个客户发出的一系列请求。
1.1.2 什么是状态管理?
什么是状态管理
- 将客户端((浏览器)与服务器之间多次交互(一次请求,—次响应)当做一个整体来看待,并且将多次交互所涉及的数据即状态保存下来。
- 状态指的是数据
- 管理指的是多次交互时对数据的修改
1.1.3 状态管理的两种常见模式(Cookie与Session)
1、客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。
2、服务器状态管理技术:将状态保存在服务器端。代表性的是Session技术。
1.2 Cookie(面试)会话技术
会话技术
- 会话:一次会话中包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
- 功能:在一次会话的范围内的多次请求间,共享数据
1.2.1 什么是Cookie?(可以跟重定向对比一下)
- 浏览器向Web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来。
- 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。
1.2.2 Cookie的原理
- 我们写了两个Demo,在tomcat中运行,相当于这两个Demo在服务器中
- 我们通过浏览器输入Demo1(发送cookie)的地址来发送请求,此时服务器作出响应,并发送了一个set-cookie(响应消息头里)
- 此时浏览器获取到了服务器的内容(因为服务器会给浏览器一个响应)
- 我们再在浏览器中输入Demo2的地址和请求消息头,服务器根据消息头和地址找到对应的资源,并响应给客户端。
1.2.3 如何创建Cookie
- 创建cookie对象,绑定数据。
- 发送Cookie对象。
- 获取cookie,拿到数据。
- Servlet API为使用Cookie提供了javax.servlet.http.Cookie。
- 创建格式
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
name :用于区分不同Cookie的名字。
value :Cookie的值。
简单示例:
Cookie c = new Cookie("welcome","welcome to zhongshan");
response.addCookie(c);
1.2.4 如何查询Cookie
- 获取客户端的所有Cookie对象∶
Cookie[] cookies = request.getCookies();//此方法有可能返回NULL
- 取一个Cookie对象的名称或值:
for(Cookie c:cookies){
System.out.println(c.getName()+":"+c.getValue());
}
1.2.5 如何修改Cookie
step1,获取客户端发送的所有Cookie。
step2,根据name找到要修改的Cookie。
step3,调用Cookie的setValue (String newValue)方法修改该Cookie的值。
step4,将修改后的Cookie加入到response发送回客户端。
Cookie[ ]Cookies = request.getCookies( ) ;
if(Cookies != null ){
for(Cookie c : Cookies){
String name = c.getName() ;
if(name.equals("city"){
c.setValue( "ShangHai”);
response.addCookie( c ) ;//同名Cookie会覆盖.以达到修改的目的
}
)
)
1.2.6 Cookie的生存时间(生命周期)
- 默认情况下,浏览器会将Cookie保存在内存中,只要浏览器不关闭,Cookie就一直存在。
- 如果希望关闭浏览器后Cookie仍在,可以通过设置过期时间。
void Cookie.setMaxAge ( int seconds ) ;//注: seconds单位是秒,精度不是很高
- seconds > 0:浏览器要保存Cookie的最长时间为设置的参数值,如果超过指定的时间,浏览器会删除这个Cookie。此时Cookie保存在硬盘上
- seconds = 0:删除Cookie。在修改Cookie的生存时间为0后,随着response发送回客户端,替换原有Cookie,因生命周期到了即将该Cookie删除。
- seconds< 0:缺省值,浏览器会将Cookie保存到内存中
1.2.7 Cookie的编码与解码
1.2.7.1 Cookie的编码
Cookie只能保存合法的ASCII字符。如果要保存中文,需要将中文转换成合法的ASCII字符,即编码。
Cookie c = new Cookie("welcome",URLEncoder.encode("欢迎来到中山","utf-8"));
1.2.7.2 Cookie的解码
编码后的Cookie为了看到实际的中文,需要还原后再显示.
for(Cookie c:cookies){
System.out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
}
- 注意:
解码要与编码格式保持一致
package com.qst.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
PrintWriter out =response.getWriter();
for(Cookie c:cookies){
System.out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
out.println(c.getName()+":"+URLDecoder.decode(c.getValue(),"utf-8"));
}
}
}
1.3 cookie的特点和作用
cookie的特点和作用
特点:
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie 的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie—般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别