一、会话技术的引入

1.问题:将验证码保存在servletcontext中会有问题,这是一个域对象,并且是一个全局变量,如果有两个人同时去获取验证码,第一个人还没有输入验证码,这个时候第二个人已经重新请求了验证码,所以第一个人会一直显示验证码输入错误
2.需求:每个用户去访问服务器的时候,验证码都应该保存在一个共享内存中,但是这个共享内存必须是每个浏览器独立的
3.会话:打开浏览器到关闭浏览器之间所做的一系列请求,我们称之为一次会话
4.会话技术:在一次会话的多次请求之间共享数据,因为http协议无状态(相互独立,无法共享数据)

二、Cookie的学习

1.使用Cookie的过程演示

2.特点:数据会保存在浏览器中
3.代码实现

//第一次请求服务器,服务器给浏览器响应cookieCookie cookie = new Cookie("code",code);resp.addCookie(cookie);
//再次请求服务器,会携带上一次响应的cookie,然后服务器会获取cookieCookie[] cookies = request.getCookies();if(cookies!=null&&cookies.length>0){for (int i = 0; i < cookies.length ; i++) {String name = cookies[i].getName();String value = cookies[i].getValue();System.out.println("服务器生成的验证码"+name+":"+value);}}
//用户输入的验证码String checkcode1 = request.getParameter("checkcode1");System.out.println("用户输入的验证码code:"+checkcode1);
//演示结果用户输入的验证码code:ocq4pJSESSIONID:3AC643B6443FAD920FC11D6262F11FD2服务器生成的验证码code:OCQ4PIdea-dfc259e4:a9775511-fb8e-4df1-8db7-1a278efd9dd3

4.Cookie在传输过程中存在的位置

响应消息的响应头里面会响应set-Cookie:code=OCQ4P(每一个浏览器必须要支持cookie,cookie在响应头里面),自动保存在浏览器内存中
请求消息的请求头里面会携带Cookie:code=OCQ4P,自动携带

5.cookie的相关方法

//设置cookie的有效路径,以后只有浏览器访问这个路径的资源才会携带这个cookie*/String code="bianyiit-path_编译IT";Cookie cookie = new Cookie("code",code);cookie.setPath("/Cookie03/user");//这里需要设置cookie的真实路径浏览器访问(localhost:8080/Cookie03/user/servletDemo04);//访问的时候也要加上真实路径

6.在cookie中使用中文会出现乱码问题--响应行和响应头里面不能有中文

中文--非中文--中文 URLEncoder
//URL编码String code="bianyiit-path_编译IT";code = URLEncoder.encode(code, "utf-8");
//解码code = URLDecoder.decode(code, "utf-8");

7.面试题--cookie的分类:持久级别的cookie和会话级别的cookie

会话级别的cookie:cookie保存在浏览器内存中,浏览器关闭,cookie消失(一次会话范围内有效)
持久级别的cookie:Cookie cookie = new Cookie("code",code);//设置cookie的有效时间cookie.setMaxAge(5*60);//保存五分钟resp.addCookie(cookie);
删除持久级别的cookie,可以设置cookie的有效时间为0Cookie cookie = new Cookie("code","");cookie.setMaxAge(0);resp.addCookie(cookie);

三、Session的学习

1.使用Session的过程演示

2.特点:数据保存在服务器中
3.代码演示

//产生验证码保存在服务器的Session里面HttpSession session = req.getSession();session.setAttribute("code",code);
//第二次请求服务器的时候,从Session取数据HttpSession session = request.getSession();Object code = session.getAttribute("code");
关闭浏览器之后,Session里面不会保存之前的数据,因为是在一次会话中

4.基本原理

set-Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
Cookie:JSESSIONID:3AC643B6443FAD920FC11D6262F11FD2
用一个唯一的ID去标识Session,两个用户同时访问服务器的时候,会通过携带过来的ID找到对应的Session
第一次请求的时候没有携带JSessionID,所以第一次请求的时候是创建Session,然后响应JSessionID给浏览器
第二次请求和以后的请求就会标识对应浏览器携带的JSessionID去对应的Session里面去取对应的数据
Session的实现基于cookie

5.Session的一些细节

//关闭浏览器,服务器并不知道浏览器关闭了,所以Session并不会立马销毁,在项目的配置文件web.xml中,我们看见Session的保存时间为30分钟
//Session可以作为域对象存储数据
//三个域对象的作用范围request :一次请求session :一次会话的多次请求之间servletContext:整个web项目

6.Session的生命周期

创建:浏览器第一次调用request的getSession方法的时候去创建Session
销毁:1.默认30分钟有效时间到期2.手动调用session.invalidate();3.服务器非正常关闭的时候,session会销毁4.如果正常关闭服务器,Session会被钝化(序列化)到磁盘,下一次重新启动tomcat的时候,Session又会被锐化(反序列化)到内存中在IDEA中,每次发布项目都会创建tomcat的临时配置,每次重启tomcat,配置文件都会重新生成,之前的会被删除

7.cookie和session的区别

1.cookie的数据是保存在浏览器中的,session的数据是保存在服务器中的
2.cookie相对不安全,而session相对安全
3.cookie只能保存少量的数据到浏览器(对cookie的个数和大小有限制,并且对每个项目的cookie数据也有限制)
4.session对保存的数据量和个数没有限制

8.防止验证码重复使用

//为了防止用户通过浏览器的回退按钮,再次输入原来的验证码还是可以登录进去
//在获取完Session中的验证码之后将服务器中Session的内容移除掉
String code=(String)request.getSession().getAttribute("code");
request.getSession().removeAttribute("code");

JavaWeb学习的第十五天(会话技术之Cookie_Session)相关推荐

  1. javaweb学习总结(二十五)——jsp简单标签开发(一)

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  2. javaweb学习总结(二十五):jsp简单标签开发(一)

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  3. javaweb学习总结二十五(response对象的用法一)

    一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...

  4. javaweb学习总结(四十五)——监听器(Listener)学习二

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  5. javaweb学习总结(二十五)——Apache的DBUtils框架学习

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  6. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  7. 学习笔记(十五)——镜像的知识点与注意事项

    学习笔记(十五)--镜像的知识点与注意事项 一.基础知识 1.SQL Server镜像只有两种模式:高安全模式和高性能模式.两种模式的主要区别在于在事务提交后的操作. 在高性能模式下,主体服务器不需要 ...

  8. 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五

    在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1)  虚拟内存,最适合用来管理大量对象或结构数组: 2)  内存映射文件,最适合用来 ...

  9. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

最新文章

  1. getbytes方法_关于C#中识别和查找中英文字符串的解决方法和字符串处理方式的笔记...
  2. [置顶]IA32 architecture 学习笔记 (一)
  3. linux 服务器安装mysql5.6
  4. 使用Oracle Data Integrator(和Kafka / MapR流)完善Lambda体系结构
  5. ***PHP 去除换行符
  6. Android 读写SDcard (转)
  7. 前端框架你究竟选什么
  8. vs2010一运行就报错deven.exe assert failure 解决方法,卸载系统中.netFramework最新版本的(简体中文)...
  9. OpenMAX IL介绍与其体系
  10. testbench简介
  11. ERStudio使用细则
  12. 【180630】VC++画面炫丽的2D 太空射击游戏源码
  13. 模电之半导体基础篇1(本征半导体、杂质半导体)
  14. 使用python提取所有word文件中的所有图片
  15. 比特率 Kbps kbit/s 1KB/s Byte 的正确理解
  16. 法国CONDENSE珂蒂丝官宣苏菲-玛索成为香水系列代言人
  17. plasma桌面特效无效的解决办法
  18. 小羊驼和你一起学习cocos2d-x之二(屏幕匹配、多分辨率解决方案、分辨率适配)
  19. 洛谷P1797 克鲁斯的加减法(纯暴力)
  20. 用客户喜欢的方式触达,才是收集反馈的正确姿势

热门文章

  1. 举个栗子!Tableau 技巧(193):创建箭头环形进度图
  2. 爬虫框架scrapy
  3. 嵌入式固件的自校验方案(keil + arm)
  4. easypoi数据校验
  5. 基数和权值对于各进制之间转换的意义
  6. 布隆过滤器速度_布隆过滤器(Bloom Filter)详解
  7. Windows Phone的应用程序认证要求
  8. Veeam 12 for VMware 新功能和改进
  9. quartus 中导入device的方法及遇到的问题
  10. PyInstaller 打包配置文件