现在的位置: 首页 > 综合 > 正文

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

2018年02月21日 ⁄ 综合 ⁄ 共 1796字 ⁄ 字号 评论关闭

首先看login.jsp

可以看出页面中的表单提交时,发出的action请求是login,并且form中定义了两个隐含域action和tourl,但是其中action这个隐含域并没有赋值。

看请求的处理类在struts.xml中的注册:

从中可看出login这个action中除了默认的拦截栈外,还另外设置了三个拦截器(Interceptor),我一开始以为登录的表单验证是在拦截器中完成的,这三个拦截器的实现类均在com.laoer.bbscs.web.interceptor包中,查看这三个实现类的源码可知,这三个拦截器与表单验证无关,而似乎是用来设置用户IP,用户cookie和请求路径的。

上面action指定的处理类是loginAction,查看action-servlet.xml(大多action的处理类bean都定义在这个文件中),loginAction定义如下:

可知其实际的实现类是com.laoer.bbscs.web.action.Login

看处理类Login.java,看其中的execute()方法

可知其会根据this.getAction()的返回值来做不同的处理,其中getAction()是其父类BaseAction的方法,用于获得其父类的成员action。那么我们login.jsp表单提交时这里设置的成员action的值是什么呢?

在上面的login.jsp提到过表单中有一个隐含域action,它虽然会随表单一起提交,但它并没有赋值。我们看Login的父类BaseAction中的内容:

可知原来在其中本来就给action赋了初值为”index”,那么当我们提交登录的表单时,BaseAction属性action的值就是”index”,分析Login.java中的代码,如果真是这样程序会return this.input(),最终会return  INPUT或者”loginPass”,这一过程中并没有进行任何表单验证动作,所以显然当我们提交这一表单时,属性action的值不应该是”index”。注意到以下代码:

若action的值是”index”,会把action改设为”login”,并且并不是只这一处,execute方法中每个if判断后都会执行this.setAction(“login”),为什么要这么做呢?

这么做是为了保证处理某一次login请求后,后一次再处理login请求时属性action的值默认为”login”!

以我们初次登录论坛为例:

web.xml中定义的服务器主页是index.jsp

Index.jsp中其实是发出了一个login请求进行跳转。

也就是说,当我们输入localhost:8080/TianYiBBS时发出login.bbscs,这时会创建一个action类Login来处理这一请求,这时这个Login对象的action属性是"index",而处理的结果便是跳转到登录界面。而在处理这个请求的过程中,Login对象会把自己的action属性改为"login"(如上所述),这样当我们填写完登录界面中的表单,再次提交时其实是第二次发出login.bbscs请求,而这时用的处理请求的对象仍然是第一次请求时创建的那个Login对象,而这时它的action已经被改为”login”了。

继续看Login类中的execute方法:

可知表单提交时会执行login()方法,查看login()方法,显然,表单的验证在login()方法中进行,验证失败会写入错误信息返回INPUT,验证成功则返回SUCCESS。

但是,作者为什么要这么做呢?似乎他一开始也不是这么做的,不然也不会在login.jsp中有那个没赋值的隐含域。

也许是因为用隐含域是无效的,因为在Login中其实并没有action成员,也没有setAction()方法,都是在它的父类BaseAction中才有的。所以就算设置了名字是action的隐含域,sturts2也无法找到和设置属性action。

再来看一下验证码是如何实现的,login.jsp中的代码:

可知验证码图片的链接是authimg,authimg是在哪儿定义的暂时还没有搞清楚,但是可以确定产生验证码所用到的类是com.laoer.bbscs.web.servlet.AuthImg。

authimg可能是在值栈中的一个值。

 

抱歉!评论已关闭.