Cookie
概述
HTTP协议是无状态的,无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此cookie就是在这样一个场景下诞生。
Cookie对象(在客户端,不是内置对象):Cookie对象是由 服务端生成的 ,再发送给客户端保存。
相当于 本地缓存的作用: 客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。
Cookie的本质
Cookie的本质是一个键值对 Cookie: name=value
Cookie也是一个JAVA类在这个包下→javax.servlet.http.Cookie
主要有以下方法:
public Cookie(String name,String value)
String getName():获取name
String getValue():获取value
void setMaxAge(int expiry);最大有效期 (秒)
Cookie的产生和使用过程
以一个能记住用户名的登陆功能作为例子:
先写一个校验登陆信息的页面(check.jsp)↓
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if(name.equals("zs") && pwd.equals("abc")){
Cookie cookie1 = new Cookie("name",name);
Cookie cookie2 = new Cookie("pwd",pwd);
//设定cookie的有效时间为10秒
cookie1.setMaxAge(10);
response.addCookie(cookie1);
response.addCookie(cookie2);
response.sendRedirect("result.jsp");
}else{
out.print("登陆失败用户名或密码有误");
}
%>
</body>
</html>
再写登陆成功后会转跳到的页面(result.jsp)↓
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
登陆成功!
</body>
</html>
现在写一个登陆时的页面(login.jsp),他会使用Cookie(如果有的话)↓
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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里面的uname值
String uname;
%>
<%
boolean flag = false;//cookie默认失效
//从request重获取,一次会获得所有的cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
//如果能找到key为name的cookie
if(cookie.getName().equals("name")){
uname = cookie.getValue();
flag = true;
}
}
if(!flag){
out.print("Cookie 已失效");
}else{
out.print("Cookie:"+ uname );
}
%>
<form action="check.jsp" method="post">
<!-- uname不为空时使用uname作为用户名的值 -->
用户名:<input type="text" name="uname" value="<%=uname==null?"":uname%>"/><br/>
密码:<input type="password" name="upwd"/>
<input type="submit" value="登陆">
</form>
</body>
</html>
测试
打开登陆页面↓
输入zs和abc↓
登陆成功↓
回到login.jsp↓发现用户名自动保存了,说明cookie生效了(**PS:**有时候会因为某些缓存的原因需要刷新几次才能看到这个页面)
10秒后刷新发现cookie已经失效了,但是由于浏览器的功能,用户名还是被记录了下来:
Cookie总结:
- 服务端准备Cookie的方法:
Cookie cookie1 = new Cookie(“name1”,“zs”);
response.addCookie(Cookie cookie) - 服务器通过页面跳转(转发,重定向)发送Cookie
- 使用Cookie实现 记住用户名 功能
- 客户端获取cookie的方法: request.getCookies();此方法会一次性获得所有从服务端发送过来的cookie,所以需要用一个
Cookie[]
(Cookie数组)接收 - 通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie(这个Cookie与在下面的session有紧密联系)
session
客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);
服务端由会 产生一个cookie,并且 该cookie的name=JSESSIONID ,value=服务端sessionId的值;
然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)
客户端第二/n次请求服务端时:服务端会先用客户端cookie种的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;
例子:
客户端: 顾客 ->钥匙(cookie和jsessionid)
服务端: 商场 ->存包柜(session和sessionid)
顾客第一次存包:商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)。
如果是新顾客(没钥匙) ,分配一个钥匙 给该顾客; 钥匙 会和 柜子 一一对应;
第二/n次 存包:商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)
如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙 会 和柜子 自动一一对应。
代码例子:CSDN:https://download.csdn.net/download/weixin_43217564/11592915
百度网盘:链接:https://pan.baidu.com/s/1HilWabj0uUjiCD6q6MPyww
提取码:y9ka
总结
session:
a. session存储在服务端
b. session是在 同一个用户(客户)请求时 共享
c. 实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终 通过session的sessionid-cookie的jsessionid
session方法:
String getId() :获取sessionId
boolean isNew() :判断是否是 新用户(第一次访问)
void invalidate():使session失效 (退出登录、注销)
void setAttribute()
Object getAttribute();
void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
int getMaxInactiveInterval():获取最大有效 非活动时间
示例:
登录
客户端在第一次请求服务端时,如果服务端发现 此请求没有 JSESSIONID,则会创建一个 name=JSESIONID的cookie 并返回给客户端
Cookie:
a.不是内对对象,要使用必须new
b.但是,服务端会 自动生成一个(服务端自动new一个cookie) name=JSESIONID的cookie 并返回给客户端
cookie和session的区别:
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |