Java Web之Cookie和session

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总结:

  1. 服务端准备Cookie的方法:
    Cookie cookie1 = new Cookie(“name1”,“zs”);
    response.addCookie(Cookie cookie)
  2. 服务器通过页面跳转(转发,重定向)发送Cookie
  3. 使用Cookie实现 记住用户名 功能
  4. 客户端获取cookie的方法: request.getCookies();此方法会一次性获得所有从服务端发送过来的cookie,所以需要用一个Cookie[] (Cookie数组)接收
  5. 通过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
发布了41 篇原创文章 · 获赞 27 · 访问量 5828

猜你喜欢

转载自blog.csdn.net/weixin_43217564/article/details/99947059