Cookie和Session
任务
-
案例一:记录上次访问时间
-
案例二:一次性验证码校验
-
可以响应给浏览器Cookie信息
-
可以接收浏览器携带的cookie信息
-
可以对session作用域的数据进行操作:存放、获得、移除
-
理解session的执行原理
案例一:记录上次访问时间
一,需求分析
在访问一个资源的时候,展示上次访问的时间
若是第一次访问则展示:你是第一次访问,若不是第一次则展示:你上次访问的时间是:xxxx
二,技术分析
1.什么是会话
用户打开浏览器,浏览不同的网页,发出多个请求,直到关闭浏览器的过程,称为一次会话。
如同打电话.
2.为什么要使用会话技术
保存用户各自的数据。
*私有的数据,购物信息数据保存在会话技术中.
3.常用的会话技术
3.1cookie
cookie是客户端(浏览器)端的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。
3.2session
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。
4.cookie的使用
4.1API概述
4.2 创建一个Cookie对象
new Cookie(String name,String value); //cookie只能保存字符串数据。且不能保存中文
4.3 把cookie写回浏览器:
HttpServletResponse的一个方法
void addCookie(Cookie cookie);
4.4 获得浏览器带过来的所有Cookie:
HttpServletRequest
Cookie[] getCookies() ;得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
4.5cookie的 API
cookie.getName() ; 返回cookie中设置的key
cookie.getValue(); 返回cookie中设置的value
三,思路分析
【步骤一】:创建RememberServlet.
【步骤二】:RememberServle中,获得上次访问时间.判断是否是第一次访问,进行展示
四,代码实现
public class RememberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.getCookie(cookies, "lastTime");
if (cookie == null) {
response.getWriter().print("你是第一次访问!!!");
} else {
String timeStr = cookie.getValue();
Date date = new Date(Long.parseLong(timeStr));
response.getWriter().print("您上次 时间是:" + date.toLocaleString());
}
//记录上次访问时间
Cookie c = new Cookie("lastTime", System.currentTimeMillis()+"");
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
五,总结
1,对cookie的基本操作
- Cookie[] getCookies() ;得到所有的cookie。是一个数组,开发中根据key得到目标cookie
- Cookie(String name, String value);创建一个cookie
- response.addCookie(Cookie cookie) ;把cookie写回浏览器
2,cookie的分类
2.1会话级别cookie
在默认的情况下,当浏览器进程结束的时候,cookie就会消失。
2.2持久性cookie
给cookie设置有效期,setMaxAge(int expiry) :时间是秒
-1:默认。代表Cookie数据存到浏览器关闭(保存在浏览器内存中)。
正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)
0:代表删除Cookie.如果要删除Cookie要确保路径一致。
3.cookie设置有效路径
setPath(String url) ;设置路径
浏览器可以存储多个cookie,每一个cookie都有各自的路径(没有设置, 有一个默认的路径)。一个路径不存在重名的cookie, 如果路径和名字一样,后面的会把之前的给覆盖掉,不同路径下可以有重名的cookie
-
默认路径
例如:
访问http://localhost:8080/web_Cookie/demo01; cookie默认路径 /web_Cookie
访问http://localhost:8080/web_Cookie/aaa/demo01; cookie默认路径 /web_Cookie/aaa
访问http://localhost:8080/web_Cookie/aaa/bbb/demo01; cookie默认路径 /web_Cookie/aaa/bbb -
随带Cookie需要的条件
只有当访问的url包含此cookie的path的时候,才会携带这个cookie;反之不会.
例如:
设置cookie的路径 /web_Cookie/aaa,
下次访问路径:http://localhost:8080/web_Cookie/aaa/demo01; cookie是可以带过来
下次访问路径:http://localhost:8080/web_Cookie/bbb/demo01; cookie带不过来 -
cookie的路径通常设置 / 或者 /项目名
4.cookie的弊端
cookie的大小(个数和自身大小)和格式(只能存字符串)有限制
不支持中文,解决中文办法
//存入的时候
URLEncode.encode(value,"utf-8");
//取出
URLDecode.decode(value,"utf-8")
案例二: 一次性验证码校验
一,需求分析
在网站登录的时候,生成一个验证码.登录的时候对验证码进行校验.
二,技术分析
1.session概述
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所有用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象
2.cookie和Session的不同
- cookie是保存在浏览器端的,大小和个数都有限制。session是保存在服务器端的,安全一些。
- cookie不支持中文,并且只能存储字符串;session可以存储基本数据类型,集合,对象等
3.Session的基本用法(作为域对象存数据)
request.getSession(); 获得session
Object getAttribute(String name) ;获取值
void setAttribute(String name, Object value) ;存储值
void removeAttribute(String name) ;移除
4.Session的执行原理:基于Cookie的
5.getSession()的执行原理(了解)
1、获得cookie中传递过来的SessionId
2、如果Cookie中没有sessionid,则创建session对象
3、如果Cookie中有sessionid,找指定的session对象
如果有sessionid并且session对象存在,则直接使用
如果有sessionid,但session对象销毁了,则执行第二步
三,思路分析
【步骤一】生成验证码的时候,将随机产生的4个字母或数字存入到session中。
【步骤二】在页面中输入一个验证码点击登录.提交到LoginServlet
【步骤三】在LoginServlet中获得页面提交的验证码和session中验证码比较
【步骤四】如果不一致,给用户一个错误的提示.
【步骤五】如果一致,再去比较用户名和密码
四,代码实现
五,总结
1.三个域对象比较
如果是正常关闭服务器,
把session(内存)序列化到服务器磁盘上,再次启动,把磁盘上的文件反序列化到内存里面
序列化:对象变成字节序列(以文件形式存在的)的一个过程
反序列化: 字节序列(以文件形式存在的)变成对象的一个过程
-
session里面存的数据, 重定向有效吗?
request里面存的数据, 重定向是无效的;
session里面存的数据, 重定向有效的;
3.cookie和session的选择?
- 如果保存的数据量不大, 如果保存的数据不是很重要, 如果保存的数据是一般的字符串,通常用cookie
- 如果保存的数据量很大, 如果保存的是对象, 如果保存的数据特别重要, 通常用session