Struts及Hibernate的应用-注册登录系统,附源码(idea 2021版本)

Struts及Hibernate的应用-注册登录系统,附源码(idea 2021版本)

IDE和依赖包
IDE 是idea 2021
struts-2.5.26:https://pan.baidu.com/s/1jJyZvVKhiQ7STX29PZ5_xg
提取码:z4ba
hibernate-release-5.4.31.Final:https://pan.baidu.com/s/13kP83HfIBocPebejDSnZGg
提取码:1s6m

相关功能实现详细流程:
1、需求介绍
项目采用Hibernate作为java环境与关系数据库之间映射的持久化工具,并采用Struts2作为整个应用的控制与整体调度的控制层框架。实现了Web开发项目中简单注册登录功能,包括验证码生成与验证、账户注册、修改密码、登录验证、自动登录、在线人数展示等功能。
整个项目的文件目录如下图所示:在这里插入图片描述

1.1验证码生成与验证
用户在登录过程中,除了需要输入账户信息外,为了防止用户利用机器人自动注册、登录、灌水等可能对网站照成危害的行为,企业级网站都会采用生成识别度较低的验证码来杜绝此类事件的发生。
该项目的登录页面也具有了一个简单的验证码,并且具有点击图片自动更新的功能。用户输入验证码后,系统会自动验证验证码,只有验证码通过了验证,系统才会进行登录验证。
1.2账户注册
账户注册功能的实现,实际就是将满足要求的用户名和密码保存到存储账户信息的数据库中。用户输入的用户名作为数据库中的标志,所以在数据库中需要将用户名作为整条记录的标志,必须具有唯一性,这一点可以在数据库中进行一定的约束。在java层,也需要通过一定的数据约束来对账户和密码格式进行一定的约束,如,用户名首位必须大写,并且总位数要在4~6位之间;密码需要包含字符、数字和符号,这些在代码层的约束,不但能减少直接在数据库上进行约束而对数据库管理系统产生的负担,而且能显著提升效率,提高判错速度,提高用户的体验感。另外,由于用户输入的密码可能存在错误,因此,让用户输入两次密码并匹对两次密码,能有效减少密码输错问题发生的概率,提升用户体验感。
1.3修改密码
在关系数据库中,修改密码实际上就是对数据库中对应账户信息的密码进行修改。通过用户名在数据库中定位元组,将元组中密码修改即可。
1.4登录验证
登录验证包含了验证码的验证和账户信息的验证,主要目的是在数据库中检验账户信息是否存在。在进入数据库检验账户信息之前,首先验证验证码的正确性,验证码正确之后,再进行账户信息的验证。实际上,登录验证就是在数据库中通过用户名和密码两个属性查找一个元组,如果元组存在,则说明账户信息存在且正确,否则,账户信息中用户名或密码有误。
1.5自动登录
模拟自动登录的功能实现依赖于Cookie和Filter机制,用户第一次访问数据库时,将用户是否勾选自动登录的信息通过记录在Cookie中并发送给浏览器的方式将是否自动登录这一信息保存在浏览器中。当用户再次访问服务器时,服务器通过获取浏览器传来的含有是否自动登录信息的Cookie,得知用户是否选择自动登录,从而对两种情况做出不同的反映。如果Cookie中包含的信息显示用户勾选了自动登录,则直接跳过登录页面,用户可以直接处于登录状态。
1.6在线人数展示
模拟在线人数的展示功能是基于监听器机制实现的。在服务器中,没增加或减少一个用户时,session对应创建和销毁。通过监听器监听session的创建和销毁,就能显示用户的在线情况。在过滤器中定义一个变量,当session被创建时,该变量进行自增操作,当session被销毁时,则该变量进行自减操作。

2、技术描述
程序总开发过程中主要功能的实现分为7步,分别时验证码的生成与验证、账户注册、登录验证、修改密码、自动登录、过滤器的定义、在线人数展示,总开发流程图如下:
在这里插入图片描述
2.1验证码生成与验证
2.1.1验证码生成与验证功能实现流程图
在这里插入图片描述

2.1.2验证码的生成(在LoadIcodeAction.java中实现)
(1)定义createRandom()方法。
createRandom()方法用于随机生成4个在09以及az之间的字符。将这4个字符组成一个字符串,并作为返回值返回。
在这里插入图片描述

(2)定义drawBackground(Graphics g)方法
drawBackground(Graphics g)方法用于验证码背景的生成,通过for循环在画布上随机产生多个不同颜色和位置的点。
在这里插入图片描述

(3)定义drawRands(Graphics g, String rands)方法
DrawRands(Graphics g, String rands)方法用于在画布上的不同位置生成验证码,将createRandom()产生的4个字符串在特定的4个位置输出展示出来。
在这里插入图片描述

(4)定义execute()方法
在execute()方法中,分别调用createRandom()、drawBackground(Graphics g)、drawRands(Graphics g, String rands)三个方法,实现验证码的生成,并通过输出流ByteArrayOutputStream将验证码作为一张jpeg类型的图片输出。同时,通过HttpSession生成的验证码通过setAttribute()方法赋值给为名为checkCode的属性,实现验证码在程序中的传递,为后续的验证码的验证提供验证值。
在这里插入图片描述

2.1.3在strutsx.xml中配置LoadIcodeAction。
配置loadIcodeSer.action,当返回值为success时,设置结果的输出类型为stream,contentType类型为image/jpeg。
在这里插入图片描述

2.1.4验证码的刷新功能(在loginOrRegister.jsp中实现)
(1)局部动态刷新function refreshCode()方法
① 通过重新调用loadIcodeSer.action,生成新的验证码实现验证码的刷新,在通过document.getElementById获得需要属性的部位,实现局部刷新的效果。
在这里插入图片描述

② 在img标签中调用loadIcodeSer.action和refreshCode()
调用loadIcodeSer.action实现验证码的生成,在通过调用refershCode()方法实现点击验证码刷新验证码的功能。
在这里插入图片描述

2.1.5验证码的验证(在LoginAction.java中实现)
在LoginAction.java中,通过getter和setter方法调用loginOrRegister.jsp中传递的code。通过session.getAttribute()方法获取loadIcodeAction.java生成的验证码checkCode。在if语句中将code与checkCode比对,实现验证验证码的功能。
在这里插入图片描述

2.2账户注册
2.2.1账户注册功能实现流程图
在这里插入图片描述

2.2.2获得待注册账户信息(在loginOrRegister.jsp中实现)
(1)定义名为registerForm的form标签,method为post,action为register.action。form标签中包含了3个input标签和一个botton,input标签分别命名为username、password、repeatpassword,分别用于输入用户名、密码和重复密码。botton标签用于执行数据传输,其中包含属性onclick的值为return checkFormForRegister()。
在这里插入图片描述

(2)function checkFormForRegister()的定义
获取registerForm中的username、password和repeatpassword后,通过一系列的if语句分别判断三种输入框中是否输入了信息、密码和重复密码是否一致,对不同的错误通过alert()方法进行提示。
在这里插入图片描述
2.2.3将账户信息添加到数据库中(在UserDaoTmpl.java中实现)
将账户信息添加到数据库中是通过SQL语句实现的,由于使用了Hibernate框架,所以只需要调用save()方法就能实现在数据库中插入信息。
在UserDaoTmpl.java中,定义add(UserEntity userEntity)方法。
① 创建SessionFactory对象sessionFactory,通过sessionFactory获得session。
② 创建一个整型变量result,初始值为0。
③ 创建保存用户信息到数据库中的事务。在事务中通过session.save()执行账户信息的保存任务。执行完成后,对result赋值为1。
④ 返回result的值。
在这里插入图片描述

2.2.4 Action的定义(在RegisterAction.java中实现)
RegisterAction.java的作用是:获取用户输入的账户信息,并通过调用add()方法实现账户信息在数据库中的保存过程。其中定义了一个register方法,该方法能够对账户信息保存的不同结果返回不同的值。RegisterAction的定义如下。
① 通过getter()和setter()方法获取用户输入的用户名和密码。
② 在register()方法中实例UserDaoTmpl对象userDaoTmpl和UserEntity对象userEntity。
③ 通过userDaoTmpl调用add()方法,判断add()方法的返回值是否为1,如果为1,register()方法返回SUCCESS,否则,返回ERROR。
在这里插入图片描述

2.2.5在struts.xml中配置Action
配置名为register的action,对应的class为Action.RegisterAction,方法为register。当register()返回值为success时,页面将跳转到登录页面,返回值为error时,页面跳转回注册页面。(注意:标红并非错误,而是编译器无法解析,是编程环境自身问题,程序依旧可以运行,下同)
在这里插入图片描述

2.3登录验证
2.3.1登录验证功能实现流程图
在这里插入图片描述

2.3.2在数据库中查找用户信息(在UserDaoTmpl.java中实现)
定义find(UserEntity userEntity)方法,实现在数据库中查找用户的功能。
① 创建SessionFactory对象sessionFactory,通过sessionFactory获得session。
② 创建一个整型变量result,初始值为0。
③ 创建在数据库中查找用户的事务。在事务中定义hql语句“from UserEntity where username=:name and password=:pwd”,通过session.createQuery(hql)执行该语句,并将name赋值为userEntity.getUsername(),将pwd赋值为userEntity.getPassword()。再实例化UserEntity的对象user,用于接收session.createQuery(hql)的结果。
④ 判断user的值是否为空,如果不为空,将result的值置为1。
⑤ 返回result。
在这里插入图片描述

2.3.3 Action的定义(在LoginAction.java中实现)
LoginAction.java的定义,用于检验用户输入的验证码和LoadIcodeAction生成的验证码是否相同,在验证码无误之后,调用UserDaoTmpl中的find()方法来检测用户输入的账户信息在数据库中是否存在,并对不同的结果返回不同的字符串。具体定义如下:
① 通过getter()和setter()方法获得用户在客户端输入的username、password和code。
② 创建UserDaoTmpl对象uerDaoTmpl,通过username和password调用UserEntity的构造方法,实例化对象userEntity。
③ 通过session.getAttribute()获得LoadIcodeAction生成的验证码checkCode。
④ 在if语句中判断code和checkCode的值是否相同,在相同的情况下,通过userDaoTmpl调用find()方法,判断账户信息是否存在于数据库中。最后,对不同的条件返回不同的结果(SUCCESS或ERROR)。
在这里插入图片描述

2.3.4在struts.xml中配置Action
配置名为login的action,对应的class为Action.LoginAction,方法为login。当login()返回值为success时,页面将跳转到登录成功页面,返回值为error时,页面跳转回登录页面。
在这里插入图片描述
2.4修改密码
2.4.1修改密码功能实现流程图
在这里插入图片描述

2.4.2获取新的密码信息(在changePassword.jsp中实现)
① 定义名为changePasswordForm的form标签,method为post,action为changePassword.action。form标签中包含了4个input标签,前三个input标签分别命名为username、password、repeatpassword,分别用于输入用户名、新密码和重复密码。最后一个标签用于执行数据传输,其中包含属性onclick的值为return checkForm ()。
在这里插入图片描述

② 获取changePasswordForm中的username、password和repeatpassword后,通过一系列的if语句分别判断三种输入框中是否输入了信息、密码和重复密码是否一致,对不同的错误通过alert()方法进行提示。
在这里插入图片描述

2.4.3在数据库中修改密码(在UserDaoTmpl.java中实现)
修改密码实际上就是通过用户名在数据库中找到对应的元组,并将该元组中的密码修改的一个过程。
在UserDaoTmpl.java中定义update(UserEntity userEntity)方法来实现账户密码的修改。update(UserEntity userEntity)的定义如下:
① 创建SessionFactory对象sessionFactory,通过sessionFactory获得session。
② 创建一个整型变量result,初始值为0。
③ 创建在数据库中查找用户的事务。在事务中定义hql语句“update UserEntity set password =:password where username = :username”,执行该语句session.createQuery(hql),并将password赋值为userEntity.Password(),将username赋值为userEntity.getUsername()。如果执行成功,则将session.createQuery(hql)的结果赋值给result。
④ 返回result。
在这里插入图片描述

2.4.4 Action的定义(在changePassword.java中实现)
changePassword.java用于实现一个修改密码的动作。能够获取用户输入的用户名、密码,通过对update(UserEntity userEntity)方法的调用实现在数据库中对账户密码修改的功能。具体定义如下:
① 通过getter和setter方法获得用户输入的用户名username和新的密码password。
② 定义方法changePassword()。通过调用UserEntity的构造方法、username和password实例化UserEntity的对象userEntity;实例化UserDaoTmpl的对象daoTmpl。
③ 定义整型变量result。通过daoTmpl调用update(UserEntity userEntity)方法在数据库中对用户名所对应的密码进行修改。
④ 若result的值为1,changePassword()方法将返回SUCCESS,否则返回ERROR。
在这里插入图片描述

2.4.5在struts.xml中配置Action
配置名为changePassword的action,对应的class为Action.changePassword,方法为changePassword。当changePassword()方法返回值为success时,页面将跳转到登录页面,返回值为error时,页面回到修改密码的页面(changePassword.jsp)。
在这里插入图片描述

2.5过滤器的定义
2.5.1过滤器的定义流程图
在这里插入图片描述
2.5.2过滤器BeforeLoginFilter.java的定义(实现自动登录的核心)
过滤器BedforeLoginFilter用于在登陆前获取所有来自浏览器的Cookie,并找到其中名为isAutoLogin的Cookie,之后,通过setAttribute()方法赋值给名为isAutoLogin的session属性。
在这里插入图片描述

2.5.3过滤器BeforeLoginFilter.java在web.xml中的配置
在web.xml中定义一个名为isAutoLogin的filter,它对应的路径为Filter.BeforeLoginFilter,作用域为“/*”。
在这里插入图片描述

2.5.4过滤器ViewFilter.java的定义(限定查看权限的过滤器)
ViewFilter.java用于限定用户查看的权限,规定用户只有登录之后才能访问一些页面,如果用户没有登录,那么用户在访问这些资源是,页面将自动跳转到登录页面。其定义如下:
① 通过getAttribute()方法获取session中名为isLogin的属性。
② 通过if语句判断isLogin是否为空,如果为空,则表示用户没登陆,一次将请求转发至loginOrregister.jsp中,否则,不做任何处理。
在这里插入图片描述
2.5.5过滤器ViewFilter.java在web.xml中的配置
在web.xml中定义一个名为viewFilter的filter,它对应的文件路径为Filter.ViewFilter,作用域为“/loginPage.jsp、/success.jsp、/register.jsp”。
在这里插入图片描述

2.6 自动登录
2.6.1自动登录功能实现流程图
在这里插入图片描述

2.6.2复选框的定义(在LoginOrRegister.jsp中实现)
在LoginOrRegister.jsp中,定义了一个类型为check的input标签,制作出了一个简单的复选框。
在这里插入图片描述

2.6.3在loginAction.java中定义自动登录信息
用户在输入账目信息并登录之后,无论是选中了自动登录复选框还是没有选中,服务器都需要发送一个包含自动登录信息的Cookie到客户端,方便后续登录时判断是否需要跳过登录过程。在loginAction.java中的具体定义如下:
① 通过getter()和setter()方法获取用户在登录页面是否选中自动登录这一信息,并将该信息存在autoLogin中。
② 创建一个名为isAutoLogin的Cookie,并将autoLogin的值赋值给该Cookie,设置Cookie的生命周期时长为7天。
③ 通过response.addCookie()方法将isAutoLogin发送到客户端。
在这里插入图片描述

2.6.4过滤器BeforeLoginFilter的定义
过滤器BedforeLoginFilter用于在登陆前获取所有来自浏览器的Cookie,并找到其中名为isAutoLogin的Cookie,之后,通过setAttribute()方法赋值给名为isAutoLogin的session属性。
在这里插入图片描述

2.6.5 Action的定义(在checkAutoLogin.java中实现)
checkAutoLoign.java是一个用于检验用户是否设置了自动登录的动作,其具体定义如下:
① 通过getAttribute()方法获取session中的属性isAutoLogin。
② 通过if语句判断isAutoLogin的值是否为true,如果是,则重新发送一个最大生命周期为7天的Cookie对象isAutoLogin至客户端,实现Cookie的刷新,并返回SUCCESS,,否则,通过发送一个最大生命周期为0的Cookie对象isAutoLogin至客户端,实现Cookie的销毁。并返回ERROR。
在这里插入图片描述

2.6.6 在struts.xml中配置Action
配置名为CheckAutoLogin的action,对应的class为Action.CheckAutoLogin,方法为isAutoLogin。当isAutoLogin()方法返回值为success时,页面将跳转到登录成功;当返回值为error时,页面回到注册登录页面。
在这里插入图片描述

2.7在线人数展示
2.7.1在线人数展示功能实现流程图
在这里插入图片描述
2.7.2监听器showUserNum.java的定义
ShowUserNum.java用于监听session的创建和销毁。其定义如下:
① 在ShowUserNum类中定义整型变量temp,赋初值为0。
② 在sessionCreated中使temp值进行自增操作,并通过setAttribute()方法将temp值赋值给名为temp的session属性。达到任何一个session创建时,temp自动加1的效果。
③ 在sessionDestroyed中使temp值进行自减操作,并通过setAttribute()方法将temp值赋值给名为temp的session属性。达到任何一个session销毁时,temp自动减1的效果。
在这里插入图片描述

2.7.3在web.xml中配置监听器
在这里插入图片描述

2.7.4在index.jsp中在线人数展示的定义
在index.jsp中通过java语言的注入,实现了temp值得获取,并在页面上实现了输出。
在这里插入图片描述
3、成果展示
简单实现一次全程的使用过程。
运行程序,启动服务器。最开始的页面如下:
在这里插入图片描述
可以看到,页面左上角显示着当前的在线人数。点击我要登录。
在登录页面,默认勾选了自动登录复选框。
在这里插入图片描述

可以看到,右侧是“立即注册”按钮,点击“立即注册”。页面自动滑动,移动到注册栏。
在这里插入图片描述

输入需要账户信息,并重复密码。
在这里插入图片描述

点击“立即注册”。信息被自动保存到数据库中。在idea中连接数据库,查看刚才输入的账户信息是否存在。
可以看到,账户信息被保存在表user中。
在这里插入图片描述

之后页面自动跳转到登录页面。输入刚才注册的账户信息和验证码,默认勾选自动登录。

点击“登录”,登录成功后,进入登录成功界面。
在这里插入图片描述

点击“修改密码”,程序自动进入修改密码页面。
在这里插入图片描述

输入待修改的用户名和新密码。

点击“修改密码”按钮,系统自动在数据库中对对应用户名的密码进行修改。页面跳转到登录页面。
在这里插入图片描述

回到数据库,可以看到,对应账户的密码已经被修改完毕。
在这里插入图片描述

再返回最开始的页面,也就是index.jsp所在的页面。
在这里插入图片描述

可以看到此时页面上当前在线的人数为3。点击“退出登录”,可以看到页面上显示当前在线人数为2。
在这里插入图片描述

项目代码链接:https://pan.baidu.com/s/1HHRFSUBN0Hyp-MOn31PZHA
提取码:bzii

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值