【JavaWeb】Cookie和Session

目录

一、会话技术的概述

1.什么是会话

2.为什么要学习会话

3.会话技术分类

1.Cookie技术

2.Session技术

3.Cookie的实现原理

4.Session的实现原理

4.记录用户上次访问时间的分析

1.分析需求和流程

2.记录用户上次访问时间的代码实现

二、Cookie的概述

1.Cookie的分类

2.Cookie的API的概述

3.Cookie的使用细节总结

 三、Session的概述

1.什么是Session

2.为什么有Cookie还要有Session

3.Session如何保存用户数据

4.Session的实现原理

5.Session作为域对象存取数据

1.Session作为域对象的API

 2.Session作为域对象的作用范围

6.Servlet的域对象的总结

1.请求范围(ServletRequest)

2.会话范围(HttpSession)

3.应用范围(ServletContext)

四、案例需求描述

1.案例功能分析

2.案例准备

2.1创建web项目

2.2引入jar包

2.3创建包结构

2.4引入工具类和配置文件

2.5引入相关的类并修改

2.6创建登录页面

2.7用户登录流程

2.8用户登录代码实现

2.9一次性验证码


一、会话技术的概述

1.什么是会话

会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话。

2.为什么要学习会话

每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。

例如:用户点击超链接购买一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息。

思考:用户购买的商品保存在request或ServletContext中是否可以?

不可以,request在服务器相应之后就销毁了,里面的数据也就丢失了,而ServletContent里面的内容是共用的,不能所有人买的东西都放在一起。

3.会话技术分类

1.Cookie技术

Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。

2.Session技术

Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。

3.Cookie的实现原理

客户端发送购买笔记本的请求,然后服务器接受之后,用set-cookie把信息返回给浏览器,并保存保存在浏览器的内存中,等你购买手机的时候,向服务器发送请求,这时候cookie会把前面的笔记本和手机都发送给服务器,然后服务器用set-cookie把笔记本和手机的信息返回给浏览器,保存在其内存中。当点击结账的时候,cookie把笔记本和手机的信息发送给服务器进行结账。

4.Session的实现原理

 客户端发送购买笔记本的请求,这时候服务器会为浏览器开辟一个空间,并为其设置一个单独的唯一标识的ID,响应之后,会把这个唯一标识的ID返回给浏览器,保存在其内存中。当你购买手机的时候,就会把带着这个唯一标识ID和手机的发送给服务器,然后服务器根据这个ID,把手机的信息存入到开辟的空间中,响应之后,服务器会把这个唯一的标识ID又返回给浏览器。当你结账的时候,浏览器带着唯一的标识ID,去打开服务器的对应的空间,客户这个客户端所购买的商品,计算金额结账处理。

总的来看,cookie是把客户的信息由服务器返回给浏览器,保存在浏览器的内存中,而Session是把客户信息保存在服务器开辟的空间中,返回给浏览器一个唯一标识的ID,然后浏览器保存的是这个ID。这就是两种技术的区别。

4.记录用户上次访问时间的分析

1.分析需求和流程

2.记录用户上次访问时间的代码实现

1.获得从浏览器带过来的Cookie

通过HttpServletRequest对象中的方法:

2.向浏览器回写Cookie

通过HttpServletResponse对象中的方法:

 3.Cookie的构造

4.案例代码实现

4.1创建一个web项目

4.2创建包结构

4.3编写工具类

4.4编写Servlet

二、Cookie的概述

1.Cookie的分类

案例存在问题:用户访问Servlet,记录用户的上次访问时间。但是如果用户将浏览器关闭,重新打开浏览器访问程序,程序就会把其当成是第一次访问:(显示,您好,欢迎来到本网站)。

1.默认级别的Cookie

指的是没有设置有效时间的Cookie,默认的情况下只要关闭了浏览器,Cookie也会被销毁。(Cookie存在于浏览器的内存中,当关闭了浏览器Cookie就销毁了)。

2.持久级别的Cookie

指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,将Cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。

案例问题解决:

给Cookie设置有效路径和有效时长之后就会变为一个持久化的Cookie,就会保存到硬盘上,而不是浏览器的内存上。

2.Cookie的API的概述

1.构造方法

Cookie(String name,String value);

2.其他的方法

2.1获得Cookie的名称的方法

2.2获得Cookie的值的方法

2.3设置Cookie的有效域名

2.4设置Cookie的有效路径

2.5设置Cookie的有效时长

3.Cookie的使用细节总结

  1. 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
  2. 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
  3. 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----浏览器存放的Cookie的大小和个数是有限制的。
  4. 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int maxAge)方法,以秒为单位的。
  5. 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。

 三、Session的概述

1.什么是Session

Session称为是一次会话,Cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。

2.为什么有Cookie还要有Session

1.Cookie局限性:

  • Cookie保存的数据是有个数和大小的限制的。
  • 数据是保存客户端浏览器上(相对不是很安全)。

2.Session:

  • Session没有个数和大小限制。
  • 数据是保存在服务器上(相对比较安全)。

3.Session如何保存用户数据

Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到Session对象。

4.Session的实现原理

服务器是如何实现一个session为一个用户浏览器服务的?

Session的实现原理:基于Cookie,基于Cookie回写了一个Session的ID。

5.Session作为域对象存取数据

1.Session作为域对象的API

①向session中存入数据:

②从session域中获取数据:

 ③从session域中移除数据:

 2.Session作为域对象的作用范围

Session作为域对象,作用范围就是一次会话的范围。一次会话,指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。

6.Servlet的域对象的总结

1.请求范围(ServletRequest)

①何时创建和销毁的:

  • 创建:当用户向服务器发送一次请求,服务器创建一个request对象。
  • 销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象。

②如何存取数据:

  • 存数据:void setAttribute(String name,Object value);
  • 取数据:  Object getAttribute(String name);

③作用范围:   作用范围:一次请求。(转发就是一次请求)。

2.会话范围(HttpSession)

①何时创建和销毁的:

  • 创建:服务器端第一次调用getSession()方法的时候。
  • 销毁:三种情况:

Session过期,默认的过期时间30分钟(web.xml中配置)。

非正常关闭服务器。(正常关闭服务器—session会被序列化)。

手动调用session.invalidate();

②如何存取数据:

  • 存数据:void setAttribute(String name,Object value);
  • 取数据:  Object getAttribute(String name);

③作用范围:一次会话(多次请求)

3.应用范围(ServletContext)

①何时创建和销毁的:

  • 创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。
  • 销毁:服务器关闭的时候,或者项目从服务器中移除的时候。

②如何存取数据:

  • 存数据:void setAttribute(String name,Object value);
  • 取数据:  Object getAttribute(String name);

③作用范围:整个应用

四、案例需求描述

1.案例功能分析

2.案例准备

2.1创建web项目

2.2引入jar包

2.3创建包结构

2.4引入工具类和配置文件

2.5引入相关的类并修改

修改配置文件:

2.6创建登录页面

2.7用户登录流程

用户输入用户名或密码进行登录:

  1. 如果用户名或密码错误,保存错误信息,回到登录页面。
  2. 如果用户名或密码正确,将用户的信息保存到会话中,跳转到成功页面。

2.8用户登录代码实现

 2.8.1在登录页面回显错误信息:

2.8.2用户登录代码实现

 2.8.3编写success.jsp

2.9一次性验证码

2.9.1一次性验证码作用

一次性验证码作用:防止恶意灌水。而且一次性验证码只能够使用一次,不管成功或者失败,验证码都将失效。

 2.9.2一次性验证码的校验

一次性验证码生成(随机生成4个字母或数字,由response生成一张图片响应到页面)。

 2.9.3一次性验证码实现

1.生成验证码图片:

  • 复制Servlet到指定的包下
  • 修改web.xml完成该Servlet的配置

2.在页面中引入Servlet

3.将随机生成的字母或数字保存到session中

// 定义一个StringBuffer
        StringBuffer buffer = new StringBuffer();
        // 定义x坐标
        int x = 10;
        for (int i = 0; i < 4; i++) {
            // 随机颜色
            graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));
            // 旋转 -30 --- 30度
            int jiaodu = random.nextInt(60) - 30;
            // 换算弧度
            double theta = jiaodu * Math.PI / 180;

            // 生成一个随机数字
            int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1
            // 获得字母数字
            char c = words.charAt(index);
            
            // 将随机产生的字符存入到字符串中:
            buffer.append(c);
            
            // 将c 输出到图片
            graphics2d.rotate(theta, x, 20);
            graphics2d.drawString(String.valueOf(c), x, 20);
            graphics2d.rotate(-theta, x, 20);
            x += 30;
        }
        
        // 将buffer转成字符串对象:
        String checkcode = buffer.toString();
        // 将其存入到session中
        request.getSession().setAttribute("checkcode", checkcode);

 4.校验一次性验证码

5.一次性验证码的点击按钮切换图

5.1提供超链接:

5.2编写JS的函数

6.记住用户名的实现

6.1需求概述

如果在登录的过程中,将记住用户名的复选框勾选了,而且在登录成功情况下,需要记住用户名,在关闭浏览器,下次访问该网站的登录页面的时候,会在用户名的文本框中自动呈现出用户名。

6.2记住用户名的后台代码

6.3在页面的文本框中回显用户名

7.系统退出

7.1提供一个退出的链接

7.2编写LogoutServlet

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值