Cookie与Session

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(内存)序列化到服务器磁盘上,再次启动,把磁盘上的文件反序列化到内存里面

序列化:对象变成字节序列(以文件形式存在的)的一个过程

反序列化: 字节序列(以文件形式存在的)变成对象的一个过程
  1. session里面存的数据, 重定向有效吗?

    request里面存的数据, 重定向是无效的;

    session里面存的数据, 重定向有效的;

3.cookie和session的选择?

  • 如果保存的数据量不大, 如果保存的数据不是很重要, 如果保存的数据是一般的字符串,通常用cookie
  • 如果保存的数据量很大, 如果保存的是对象, 如果保存的数据特别重要, 通常用session
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值