cookie使用场景:
当不同的用户访问同一家网站时(采用相同的请求地址),服务器如何区分不同用户的请求操作呢?需要浏览器对发出的每个请求进行标识。属于同一个会话的请求,都带有相同的标识,不同的会话带有不同的标识。
cookie的使用的底层原理:
客户端(浏览器)访问web服务器时(jsp文件),服务器通过Cookie构造器构造一个Cookie实类。然后由web服务器在HTTP响应消息头中附带Cookie实类至客户端,并保存到客户端内存中。在cookie生命周期内,以后每次请求都携带cookie
服务端构建一个cookie生成文件:cookie3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//1.创建一个Cookie对象
Cookie cookie=new Cookie("name","11111111111111111111111111111");
//2.调用response的一个方法把Cookie传给客户端
response.addCookie(cookie);
%>
</body>
</html>
第一次访问cookie3.jsp: ( http://localhost:8080/*/cookie3.jsp)
请求域中并未携带cookies,服务端接受请求之后,进行响应,将生成的cookie 传至客户端,保存在内存中
第二次访问服务端时(http://localhost:8080/*/cookie3.jsp),请求域从内存中取出cookies并携带至服务端,服务端根据cookies对请求进行分类
浏览器下次访问时web服务器时,先从内存中取出Cookie,然后在http请求头中带着Cookie对象访问服务器。
cookie周期与cookie持久化:
服务端创建cookie后,通过响应发送至浏览器,默认生命周期就是一个会话周期,若关闭浏览器,cookie就会删除。
若希望cookie持久化,则需要使用maxAge方法,将cookie就会存储在磁盘中。在设置的生命周期内,关闭浏览器之后再打开,cookie仍然存在 。还可以在多个浏览器(同一种浏览器)窗口中共享(就是不同的会话中共享)。
案例:构建一个cookie.jsp
功能:但浏览器内存中有cookie时,浏览器直接打印出所有cookie,若没有cookie,则新建cookie,并对cookie 设置生命周期(本案例设置为120s),进行持久化。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//获取Cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
//获取Cookie的name和value
for(Cookie cookie:cookies){
out.print(cookie.getName()+":"+cookie.getValue());
out.print("<br>");
}
}else{
out.print("没有一个Cookie正在创建并返回");
Cookie cookie=new Cookie("name","2222222222222222222222222222222");
/*
cookie生存周期为5s,既最大时效,以秒为单位,若为0,表示立即删除该 Cookie
若为负数,表示不存储Cookie,若为正数,表示该cookie的存储时间,单位为秒
*/
cookie.setMaxAge(120);
//调用response的一个方法把Cookie传给客户端
response.addCookie(cookie);//响应 */
}
%>
</body>
</html>
第一次访问cookie.jsp,请求中并未携带cookie,但服务器在创建cookie时,通过响应将cookie传递至客户端(浏览器)
通过不同的浏览器窗口第二次访问、第三次访问cookie.jsp:
获取相同的cookie,说明cookie存放在磁盘中(持久化),而不是每个窗口的内存中