会话技术

今日目标

4,用户登录注册案例

4.1 需求分析

需求说明:

  1. 完成用户登录功能,如果用户勾选“记住用户” ,则下次访问登录页面==自动==填充用户名密码
  2. 完成注册功能,并实现==验证码==功能

1629442826981

4.2 用户登录功能

  1. 需求:

1629443152010

  1. 实现流程分析

1629443379531

(1)前端通过表单发送请求和数据给Web层的LoginServlet

(2)在LoginServlet中接收请求和数据[用户名和密码]

(3)LoginServlet接收到请求和数据后,调用Service层完成根据用户名和密码查询用户对象

(4)在Service层需要编写UserService类,在类中实现login方法,方法中调用Dao层的UserMapper

(5)在UserMapper接口中,声明一个根据用户名和密码查询用户信息的方法

(6)Dao层把数据查询出来以后,将返回数据封装到User对象,将对象交给Service层

(7)Service层将数据返回给Web层

(8)Web层获取到User对象后,判断User对象,如果为Null,则将错误信息响应给登录页面,如果不为Null,则跳转到列表页面,并把当前登录用户的信息存入Session携带到列表页面。

  1. 具体实现

(1)完成Dao层的代码编写

(1.1)将04-资料\1. 登录注册案例\2. MyBatis环境\UserMapper.java放到com.itheima.mapper`包下:

(1.2)将04-资料\1. 登录注册案例\2. MyBatis环境\User.java放到com.itheima.pojo包下:

(1.3)将04-资料\1. 登录注册案例\2. MyBatis环境\UserMapper.xml放入到resources/com/itheima/mapper`目录下:

(2)完成Service层的代码编写

(2.1)在com.itheima.service包下,创建UserService类

(3)完成页面和Web层的代码编写

(3.1)将04-资料\1. 登录注册案例\1. 静态页面拷贝到项目的webapp目录下:

1629444649629

(3.2)将login.html内容修改成login.jsp

(3.3)创建LoginServlet类

(3.4)在brand.jsp中标签下添加欢迎当前用户的提示信息:

(3.5) 修改login.jsp,将错误信息使用EL表达式来获取

(4)启动,访问测试

(4.1) 进入登录页面,输入错误的用户名或密码

1629445376407

(4.2)输入正确的用户和密码信息

1629445415216

小结

4.3 记住我-设置Cookie

  1. 需求:

如果用户勾选“记住用户” ,则下次访问登陆页面自动填充用户名密码。这样可以提升用户的体验。

1629445835281

对应上面这个需求,最大的问题就是: 如何自动填充用户名和密码?

  1. 实现流程分析

因为记住我功能要实现的效果是,就算用户把浏览器关闭过几天再来访问也能自动填充,所以需要将登陆信息存入一个可以长久保存,并且能够在浏览器关闭重新启动后依然有效的地方,就是我们前面讲的==Cookie==,所以:

1629446248511

(1)前端需要在发送请求和数据的时候,多携带一个用户是否勾选Remember的数据

(2)LoginServlet获取到数据后,调用Service完成用户名和密码的判定

(3)登录成功,并且用户在前端勾选了记住我,需要往Cookie中写入用户名和密码的数据,并设置Cookie存活时间

(4)设置成功后,将数据响应给前端

  1. 具体实现

(1)在login.jsp为复选框设置值

(2)在LoginServlet获取复选框的值并在登录成功后进行设置Cookie

(3)启动访问测试,

只有当前用户名和密码输入正确,并且勾选了Remeber的复选框,在响应头中才可以看得cookie的相关数据

1629447232217

4.4 记住我-获取Cookie

  1. 需求

登录成功并勾选了Remeber后,后端返回给前端的Cookie数据就已经存储好了,接下来就需要在页面获取Cookie中的数据,并把数据设置到登录页面的用户名和密码框中。

1629449100282

如何在页面直接获取Cookie中的值呢?

  1. 实现流程分析

在页面可以使用EL表达式,${cookie.==key==.value}

key:指的是存储在cookie中的键名称

1629449234735

(1)在login.jsp用户名的表单输入框使用value值给表单元素添加默认值,value可以使用${cookie.username.value}

(2)在login.jsp密码的表单输入框使用value值给表单元素添加默认值,value可以使用${cookie.password.value}

  1. 具体实现

(1)修改login.jsp页面

  1. 访问测试,重新访问登录页面,就可以看得用户和密码已经被填充。

1629449530886

4.5 用户注册功能

  1. 需求

1629449648793

  1. 实现流程分析

1629449720005

(1)前端通过表单发送请求和数据给Web层的RegisterServlet

(2)在RegisterServlet中接收请求和数据[用户名和密码]

(3)RegisterServlet接收到请求和数据后,调用Service层完成用户信息的保存

(4)在Service层需要编写UserService类,在类中实现register方法,需要判断用户是否已经存在,如果不存在,则完成用户数据的保存

(5)在UserMapper接口中,声明两个方法,一个是根据用户名查询用户信息方法,另一个是保存用户信息方法

(6)在UserService类中保存成功则返回true,失败则返回false,将数据返回给Web层

(7)Web层获取到结果后,如果返回的是true,则提示注册成功,并转发到登录页面,如果返回false则提示用户名已存在并转发到注册页面

  1. 具体实现

(1)Dao层代码参考资料中的内容完成

(2)编写Service层代码

(3)完成页面和Web层的代码编写

(3.1)将register.html内容修改成register.jsp

(3.2)编写RegisterServlet

(3.3)需要在页面上展示后台返回的错误信息,需要修改register.jsp

(3.4)如果注册成功,需要把成功信息展示在登录页面,所以也需要修改login.jsp

(3.5)修改login.jsp,将注册跳转地址修改为register.jsp

(3.6)启动测试,

如果是注册的用户信息已经存在:

1629451535605

如果注册的用户信息不存在,注册成功:

1629451567428

4.6 验证码-展示

  1. 需求分析

展示验证码:展示验证码图片,并可以点击切换

1629451646831

验证码的生成是通过工具类来实现的,具体的工具类参考

04-资料\1. 登录注册案例\CheckCodeUtil.java

在该工具类中编写main方法进行测试:

生成完验证码以后,我们就可以知晓:

  1. 实现流程分析

1629452623289

(1)前端发送请求给CheckCodeServlet

(2)CheckCodeServlet接收到请求后,生成验证码图片,将图片用Reponse对象的输出流写回到前端

思考:如何将图片写回到前端浏览器呢?

(1)Java中已经有工具类生成验证码图片,测试类中只是把图片生成到磁盘上 (2)生成磁盘的过程中使用的是OutputStream流,如何把这个图片生成在页面呢? (3)前面在将Reponse对象的时候,它有一个方法可以获取其字节输出流,getOutputStream() (4)综上所述,我们可以把写往磁盘的流对象更好成Response的字节流,即可完成图片响应给前端

  1. 具体实现

(1)修改Register.jsp页面,将验证码的图片从后台获取

(2)编写CheckCodeServlet类,用来接收请求生成验证码

4.7验证码-校验

  1. 需求

1629452835571

思考:为什么要把验证码数据存入到Session中呢?

  1. 实现流程分析

1629452966499

(1)在CheckCodeServlet中生成验证码的时候,将验证码数据存入Session对象

(2)前端将验证码和注册数据提交到后台,交给RegisterServlet类

(3)RegisterServlet类接收到请求和数据后,其中就有验证码,和Session中的验证码进行对比

(4)如果一致,则完成注册,如果不一致,则提示错误信息

  1. 具体实现

(1)修改CheckCodeServlet类,将验证码存入Session对象

(2)在RegisterServlet中,获取页面的和session对象中的验证码,进行对比

至此,用户的注册登录功能就已经完成了。

(8)