天乙社区登录功能分析(二)

接上次,继续研究登录的验证码,authimg并不是值栈中的值!

由于我们确定com.laoer.bbscs.web.servlet.AuthImg就是产生验证码的类,不妨从这个开始着手,看AuthImg.java


可以看到AuthImg继承了HttpServlet类,可以看出程序中是把AuthImg当做servlet来使用的,故而去看web.xml文件:


可以看到其中定义了一个servlet它的名字是authimg,实现类是AuthImg,相对URL是/authimg,由此可知:


中的”authimg”指的其实是一个Http请求的URL,处理这个请求的类是AuthImg,并且处理的结果就是输出验证码图片,所以虽然这是个请求的URL,但同时也可以作为一张图片的URL。


这里产生了一个由四个随机的数字组成的字符串,字符串rand即为验证码图片上显示的字符串的实际正确值。


将rand放到session中,名字是”authCode”,以便在login.jsp中能够取得。


验证码图片产生的大致流程是:取得response对象的输出流out,定义一个BufferedImage对象image,在其中先画些随机的线做背景,然后画随机的四个数字,颜色也是随机产生。最后就是通过上面的两句代码,通过respone在网页中输出验证码图片。

再来看一下doGet()放法中的其他一些操作:


这里用当前的request,respone,sysConfig来创建一个UserCookie对象,然后调用它的addAuthCode方法。看看UserCookie的addAuthCode方法可知它调用了addDES方法,下面是addDES方法中的代码:


由此可知,上面doGet中的两句代码实际上做的事是:创建一个Cookie对象,将验证码实际值进行DES加密后放入该对象中,并设置其相关属性(cookie路径,过期时间,cookie的可见域),然后将该cookie对象放入到当前的response中,目的是让客户端能取得该cookie。

再看看Login.java中的login()方法中是如何进行验证码的验证的:



果然,是从session中取出前面存入的验证码(rand)和用户输入验证码进行比较。

验证码的实现分析到此。

下面来看看登录时最关键的用户密码验证是如何实现的,仍就看Login.java的login()方法:


可以看到用户输入的密码会先进行消息摘要(hash)再和用户的正确密码比较,说明在数据库中存储的用户密码是进行消息摘要后的值。看看ui是什么?


ui是一个UsrInfo对象,看看后面的getUserService方法,其是Login对象的属性userService的get方法。跟踪到UserService类的实现文件,可以发现UserService其实是一个接口,由于上面调用了它的findUserInfoByUserName方法,说明这里的userService属性一定是实现了UserService这个接口的类的实例对象。不难发现这个类就是com.laoer.bbscs.service.imp. UserServiceImp,但是到底是在哪里将一个UserServiceImp类的对象赋给了这里的属性userService呢?

我最先想到的是在action-servlet.xml中loginAction的bean定义处进行了属性的注入,看看里面的内容:


发现没有进行任何属性的注入,那Login类对象的userServices属性到底是在哪儿赋值的呢?

注意到在上面的bean定义中设置了属性:autowire="byName"。在action-servlet中定义的bean都是action,并且定义的这些bean都设置了一个属性autowire="byName",这个属性是Spring的自动装配,用来方便实现相互协作bean之间的关联关系。比如ServiceImpl有一个属性名为userDAO,Spring就会在配置文件里查找有没有名字为userDAO的bean, 自动为ServiceImpl注入。

这里的loginAction就是用到了这一点,Login类中有属性userService,通过自动装配,Spring会先查找有没有名字为userService的bean,看applicationContext.xml中的内容:


果然有名字为usrService的bean,并且其实现正好是UserServiceImp类,所以这里就实现了Login的userService属性由userServiceImp对象来注入实现。

在action的bean中经常需要注入Dao,Service这种bean,所以作者才会专门单独写一个配置文件放这些action的bean并配置autowire="byName",这些bean都会由Spring的自动装配来完成注入,由此避免了人为写大量的重复注入。         

查看UserServiceImp类的findUserInfoByUserName方法可以知道它是由UserInfoDao的同名方法来实现的,一直追踪到UserInfoDao的实现类UserInfoHibernateDAO的findUserInfoByUserName方法中(com.laoer.bbscs.dao.hibernate包中):



可知其实就是执行了一条数据库的查询语句(Spring中通过getHibernateTemplate方法来获得HibernateTemplate对象从而方便地进行Hibernate相关的数据库操作),查询的结果是数据库UserInfo表中的一个元组,它在hibernate中映射到的POJO类就是UserInfo类,在其中包含了用户的所有信息,包括用户的密码。

回到最开始Login.java中验证用户密码的语句:



这里ui就存着从数据库中查询返回的结果,调用其getRePasswd方法就获得了数据库中存储的用户密码的消息摘要值。

关于登录密码验证的分析到此




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值