Spring学习笔记:Cookie&Session
一. Cookie
什么是Cookie?
Cookie 是浏览器端保存少量数据的一种技术
特点:
-
保存少量数据 纯文本 保存当前网站的cookie;每次访问这个网站都会携带; 默认不支持中文
使用
- 服务器如何给浏览器发送保存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
- 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);
- 读取某个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{
//拒绝处理
}
}
