Spring学习笔记:Cookie&Session

一. Cookie

什么是Cookie?

Cookie 是浏览器端保存少量数据的一种技术

特点:

    保存少量数据 纯文本 保存当前网站的cookie;每次访问这个网站都会携带; 默认不支持中文

使用

  1. 服务器如何给浏览器发送保存cookie Cookie cookie = new Cookie("username","zhangsan"); response.addCookie(cookie); 响应头中命令浏览器保存一个Cookie,如下: Content-Length:20 Date:Sat, 10 Jun 2017 08:18:03 GMT Server:Apache-Coyote/1.1 Set-Cookie:username=zhangsan 浏览器一但保存cookie以后,访问我们这个网站都会带上这个cookie; 请求头中会有 Cookie:JSESSIONID=0D3EBDAC8DB3091C31C5CE048E3BBDDE; username=zhangsan32
  2. cookie有有效时间; 默认:会话期间有效(浏览器只要不关,cookie就在;cookie存在于浏览器的进程中); setMaxAge(int expiry) :设置cookie 的有效时间;秒为单位 一个正数:表示多少秒后超时(cookie自动销毁); 一个负数:表示cookie就是会话cookie,随浏览器同生共死; 0:cookie立即失效; 修改或者删除cookie都是同名cookie覆盖 Cookie cookie = new Cookie("username", "zhangsandsadsa"); cookie.setMaxAge(0); //发给浏览器 response.addCookie(cookie);
  3. 读取某个cookie(了解); Cookie[] cookies = request.getCookies(); if (cookies != null) for (Cookie cookie2 : cookies) { String key = cookie2.getName(); String value = cookie2.getValue(); if (key.equals("username")) { System.out.println(value); } }

二. Session

什么是Session?

服务器端保存当前会话大量数据的一种技术

特点

Session保存的数据可以在同一个会话期间共享

使用

session.setAttribute("username,"zhangsan");

session.getAttribute("username");

三. 会话控制

为什么在别的地方给session中保存的数据,在另外一个地方可以获取出来;

去银行存钱,取钱一致;

预先:

① 我们和服务器进行交互期间,可能需要保存一些数据,服务器就为每个会话专门创建 一个map;这个 map 用来保存数据;这个 map 我们就叫 session;

② 100个会话就会有 100 个 map;每次创建 map 的时候,这个 map 有一个唯一标示:(JESSSIONID;会话id);

利用浏览器每次访问会带上其所有的cookie;

服务器只需要创建一块能保存数据的map,给这个map一个唯一标示(JESSIONID);创建好以后命令浏览器保存这个map的标识;

以后浏览器访问就会带上这个map的标识,服务器就按照标识找到这个map,取出这个map中的数据

特别情况:

① cookie失效:默认是cookie没了;通过cookie持久化技术继续找到之前的session;

② session失效:自动超时,手动失效;

四. 令牌机制

访问页面的时候,生成一个令牌;

第一次访问页面生成一个令牌,只要不刷新页面,f5重新发送上一次请求,令牌不会变化。servlet第一次收到令牌进行比对,比对完毕,更换或者删除令牌;

下一次直接去刷新发送上次的请求,由于带来的令牌还是上次的,而这个令牌已经失效了;

应用场景:防止表单重复提交,验证码。

index.jsp{

	<%  

			String token  = UUID.randomUUID().toString();

			//分给两处

			//1、一处服务器保存,可以拿到

			session.setAttribute("token",token);

			//2、一处页面保存,每次发请求带上

	%>

	<form action="submit">

			<input name="token" value="<%=token%>"/>

	</form>

}

SubmitServlet{

	//1、拿到服务器保存的令牌

	String token01 = session.getAttribute("token");

	//2、拿到页面带来的令牌

	String token02 = request.getParameter("token");

	if(token01.equals(token02)){

		//处理请求	

		session.setAttibute("token","a");

	}else{

		//拒绝处理

	}
}
经验分享 程序员 微信小程序 职场和发展