Cookie的定义/应用场景、案例:显示上一次访问时间/记住用户名及密码、Session(与Cookie的区别、存值与取值、作用范围、生命周期)、验证码工具(判断验证码输入是否正确案例)

一、Cookie的定义及应用场景

什么是会话?

	会话指客户端(浏览器)与Web服务器之间连续发生的一系列的请求和响应。一次会话就是从开始访问到退出访问(浏览器关闭,退出登录)。

Cookie的定义

	其实就是一(小)份数据,是服务器存放在我们客户端里面的一些数据, 以后客户端每次访问服务器都会携带上一次存放在cookie中的信息。 然后服务器就可以从cookie里面取出以前存放的数据。

Cookie的应用场景Cookie的应用场景

	保存用户名、自动登录 、 浏览记录  、 显示上一次访问时间 ... 在线看视频 ..  

Cookie的使用(掌握)

  • 添加cookie

    Cookie cookie = new Cookie("user", username+"$"+password); response.addCookie(cookie);

    最终服务器会返回一个头 Set-Cookie : username+"$"+password

Cookie的定义/应用场景、案例:显示上一次访问时间/记住用户名及密码、Session(与Cookie的区别、存值与取值、作用范围、生命周期)、验证码工具(判断验证码输入是否正确案例)

  • 获取Cookie

    //获取cookie,如果request中没有带Cookie那么返回null Cookie[] cookies = request.getCookies();

    if(cookies != null){ System.out.println("有cookie"); //可能传递过来有很多个cookie值, 需要遍历一下 for (Cookie cookie : cookies) { String name = cookie.getName(); String value = cookie.getValue(); System.out.println(name + " === "+ value); } }else{ System.out.println("没有cookie"); }

  • 解决cookie保存中文报错的问题

    cookies只支持ASCII字符,而且不能有逗号,分号,空白。或者以$开头。名字在创建后不能改变。如果要存储中文的,先用URLEcoder编码,再存入,取出的时候,用decode解码。

    • 存入时:URLEncoder.encode(cookieValue, "UTF-8");

    • 取出时:URLDecoder.decode(localCookieValue, "UTF-8");

初次访问是不会有cookie的。 只要服务器使用了response.addCookie(cookie) 之后的每一次访问都会带cookie过去,给服务器。 只要浏览器中保存了cookie,那么访问服务器时,会自动携带cookie。

	Cookie在响应头中,随响应发给客户端,该响应头叫做Set-Cookie。
	Cookie在请求头中,随请求发给服务器,该请求头叫做Cookie。
  • cookie其他设置(cookie的默认有效期是一次会话中)

  • cookie其他设置(cookie的默认有效期是一次会话中)

    • 设置Cookie的有效期,cookie.setMaxAge(),参数是秒

      //设置Cookie 设置有效期 7天。 cookie.setMaxAge(60 * 60 * 24 * 7);

    • 设置跨域名使用cookie,例如让itcast.cn里面的cookie让itheima.com也能使用。cookie.setDomain(".itheima.com");(了解)

    • setPath(path),设置能使用该cookie的资源(一般是设置为项目根路径)设置cookie的有效范围

案例: 显示上一次访问时间

显示当前用户上一次登录的时间

Cookie的定义/应用场景、案例:显示上一次访问时间/记住用户名及密码、Session(与Cookie的区别、存值与取值、作用范围、生命周期)、验证码工具(判断验证码输入是否正确案例)

实现步骤

  • 1.编写一个登录的页面。

  • 2.编写一个LoginServlet用于处理登录请求。

  • 3.在LoginServlet中,通过request获取用户名和密码,并判断是否登录成功。

  • 4.在LoginServlet中,获取cookie,并获取cookie中携带的数据(上次登录的时间戳),如果没有cookie,则表示以前未登录过。

  • 5.如果登录成功则将获取到的上次登录的时间戳转换成时间格式,并显示到客户端。如果以前未登录过,则显示"欢迎第一次登录!!!"

记住用户名的功能实现。

Cookie的定义/应用场景、案例:显示上一次访问时间/记住用户名及密码、Session(与Cookie的区别、存值与取值、作用范围、生命周期)、验证码工具(判断验证码输入是否正确案例)

Cookie的问题

  1. 不安全,不能保存隐私数据,否则有可能被窃取

  2. Cookie不允许存储过长的数据. 键值对大小是有限制(一般情况下不要超过10k)

  3. 浏览器可以设置更高的拦截(安全)级别, 屏蔽掉所有的cookie。

Cookie的使用原则

  • 不要保存私人隐私信息。(如果一定要保存,那加密后进行保存。)

  • 任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode(编码),当然也可以用完善的可逆加密方式,最好不要用md5(用于判别文件的真伪)来加密(消息摘要))。

  • 是否保存登陆信息,需由用户自行选择。

  • 长于10K的数据,不要用到Cookie。Cookie只能保存String类型的数据

Session(第三个域对象)

Session与Cookie的对比

与cookie一样都是会话技术, 它们的区别在于, cookie的数据是存放在客户端 , session的数据是存放在服务器端。Cookie只能存放字符串,而session能存放任意类型的对象

session对象其实就是咱们服务器中的一块内存空间。 

 

  • 优点:

    cookie:

    ​ 数据存放在客户端,不占用服务器资源

    session:

    ​ 数据因为存放在服务器端,所以比较安全。

  • 缺点:

    cookie:

    数据存放在客户端,不安全 、 浏览器通过设置更高的安全级别可以阻止所有的cookie session:

    数据因为存放在服务器端, 服务器的压力比较大。

Session的使用

  • 获得Session对象:HttpSession session = request.getSession();

  • 获得SessionId,是唯一值。session.getId();

  • setAtrribute("name",value);往session中存放内容

  • getAtrribute("name"),获取session中存放的数据

Session存值和取值的原理

request.getSession()背后的原理

* 1.看这个request有没有带 cookie过来,并且cookie中包含一个键值对	,key为JSESSIONID,   value为一个ID值
* 2.如果没有,则在服务器内存中开辟一块新空间,然后以cookie的形式给客户端写入这块空间的ID值。
* 3.如果有,那么就不会再开辟的空间,而是使用之前的空间(也就是session对象)。

session存值和取值都是在服务器的那块内存空间上操作。

当request没有带cookie过来时,调用request.getSession(),服务器会创建一个cookie给浏览器,里面包含新开辟的服务器内存空间的ID,而且这个cookie是临时性的。

  • 请问, 关闭浏览器之后,session销毁了嘛??? 如果没有销毁,那么为什么再开浏览器来访问,就取不到以前的值了呢??

    1. Session并没有销毁 , 就是一块内存空间。 浏览器的关闭与服务器的销毁没有什么关系。

    2. 因为过来的时候,没有了那个JSESSIONID , 所以,使用request.getSession(). 服务器会给你返回全新的一块空间,并不是以前那一块空间。

Session的作用范围 & 生命周期

  • 作用范围

    ServletContext :整个项目(所有用户共用,作用域最大)

    Request : 一次请求(作用域最小)(不存在多个用户共享request)

    Session : 默认一次会话(能包含多次请求)范围内有效 (从开始访问 --- 退出访问,或者会话超时 )(不存在多个用户共享)

    不能超过Session的默认有效期

  • 生命周期

  • ServletContext:服务器开启的时候创建、项目移除或者服务器关闭的时候销毁

  • request:请求发送到服务器的时候创建,做出了响应就销毁

    • Session对象何时创建

      第一次使用request.getSession()的时候,就创建对象。

      • Session对象何时销毁

        1. sesion 超时了。 默认时间 : 30分钟(闲置30分钟,内存优化的算法LRU算法)

        2. 关闭服务器。如果是非正常关闭(那么就直接销毁session),如果是正常关闭(会将session序列化到硬盘,再销毁内存中的,下次重启服务器的时候会还原这个session对象)

        3. 调用invalidate() 让session失效。

session能不能做到浏览器关闭后,还能拿到数据?

判断验证码是否正确的案例

验证码工具的使用

  • 第一步:添加jar包。

  • 第二步:创建一个Servlet专门用于生成验证码

  • 第三步:在该Servlet中写生成验证码的代码 ​ ValidataCode validataCode = new ValidataCode(width,heigh,codeCount,lineCount); String code = validataCode.getCode(); //获得验证码 validateCode.write(resp.getOutputStream());//将服务器生成的验证码,以流的形式写给客户端(变成图片)

  • 第四步:在客户端用于显示验证码的img标签的src属性中,引入该ServLet。

  • 第五步:给该图片绑定点击事件,点击一下重新换一个验证码

    <script type="text/javascript"> var code = document.getElementById("vcode"); code.onclick = function() { //如果直接this.src="/BigDemo/code",那么浏览器会默认认定你是发的相同的请求,会发回给你相同的结果 //所以,每次都带个不一样的参数过去 this.src = "/BigDemo/code?time="+new Date(); } </script>