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
//获取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的有效范围
-
案例: 显示上一次访问时间
显示当前用户上一次登录的时间
实现步骤
-
1.编写一个登录的页面。
-
2.编写一个LoginServlet用于处理登录请求。
-
3.在LoginServlet中,通过request获取用户名和密码,并判断是否登录成功。
-
4.在LoginServlet中,获取cookie,并获取cookie中携带的数据(上次登录的时间戳),如果没有cookie,则表示以前未登录过。
-
5.如果登录成功则将获取到的上次登录的时间戳转换成时间格式,并显示到客户端。如果以前未登录过,则显示"欢迎第一次登录!!!"
记住用户名的功能实现。
Cookie的问题
-
不安全,不能保存隐私数据,否则有可能被窃取
-
Cookie不允许存储过长的数据. 键值对大小是有限制(一般情况下不要超过10k)
-
浏览器可以设置更高的拦截(安全)级别, 屏蔽掉所有的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销毁了嘛??? 如果没有销毁,那么为什么再开浏览器来访问,就取不到以前的值了呢??
-
Session并没有销毁 , 就是一块内存空间。 浏览器的关闭与服务器的销毁没有什么关系。
-
因为过来的时候,没有了那个JSESSIONID , 所以,使用request.getSession(). 服务器会给你返回全新的一块空间,并不是以前那一块空间。
-
Session的作用范围 & 生命周期
-
作用范围
ServletContext :整个项目(所有用户共用,作用域最大)
Request : 一次请求(作用域最小)(不存在多个用户共享request)
Session : 默认一次会话(能包含多次请求)范围内有效 (从开始访问 --- 退出访问,或者会话超时 )(不存在多个用户共享)
不能超过Session的默认有效期
-
生命周期
-
ServletContext:服务器开启的时候创建、项目移除或者服务器关闭的时候销毁
-
request:请求发送到服务器的时候创建,做出了响应就销毁
-
Session对象何时创建
第一次使用request.getSession()的时候,就创建对象。
-
Session对象何时销毁
-
sesion 超时了。 默认时间 : 30分钟(闲置30分钟,内存优化的算法LRU算法)
-
关闭服务器。如果是非正常关闭(那么就直接销毁session),如果是正常关闭(会将session序列化到硬盘,再销毁内存中的,下次重启服务器的时候会还原这个session对象)
-
调用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>