发表于: 2017-08-04 21:44:56
2 883
一.今天完成的主要事情
1.学习过滤器,监听器和拦截器的实现原理
自己的感受就是监听器和过滤器都是针对整个web应用的,只会在web加载的时候加载一次.过滤器的作用是取出我们想要的,通过实现Filter接口,并重写其中的doFilter方法在调用控制器之前执行某些功能,常用的过滤器是字符集过滤器,我们在程序中使用的字符集过滤器就是java自带的过滤器,我们也可以根据需求自定义过滤器,比如说可以过滤某些恶意攻击的请求,不允许它们访问控制器.监听器的作用我感觉是在web应用加载时先执行某些动作,比如我们在springmvc中使用的上下文加载监听器(contextLoaderListener),就是用于在web应用开始的时候加载spring容器的配置文件,使其中的对象在web应用开始时就创建好.
拦截器则不同,它的控制范围更小,比如可以只拦截某一个请求,相对的也更灵活,可以在一个web应用中反复使用多次,springmvc是通过实现spring自带的HandlerInterceptor接口定义拦截器类的.使用时必须实现其中的三个方法,preHandle(),postHandle(),afterCompletion(),其中preHandle是在dispatcher接到请求之后,控制器执行之前执行,完成任务五的功能主要也是在这个方法中实现.postHandle()是在控制器处理之后,视图解析器调用之前,通过打日志的方式可以证明该方法是在控制器方法执行完毕之后执行,而afterCompletion(),则是在web应用结束之后才调用.如图:
其中tagTest就是controller中的控制器方法.
我们还可以在程序中实现多个拦截器,拦截器的执行顺序是按配置时的顺序决定的,程序会执行完所有的拦截器之后再执行控制器,也可以选择不执行控制器.
2.使用拦截器,完成简单的用户登陆验证
首先,在dispatcher-servlet.xml中配置拦截器,设定规则是如果用户访问首页和hello则不拦截,直接访问职业列表或test则要拦截,如图,其中class中的值是自己编写的拦截器类,mvc:mapping则是表示拦截规则,如果需要拦截所有请求,可以不配置mvc:interceptor,直接在mvc:interceptors中配置拦截器类即可.
接着是编写拦截器类,该类是HandleInterceptor接口的实现类.
拦截器中的逻辑很简单,就是从HTTP请求对象中获取会话对象,再从会话对象中获取username参数的值,如果该值为空,则说明用户没有登陆,跳转到登陆页面,并且返回false,不再执行后续的控制器.如果不为空,说明用户已经登陆,直接返回true,执行后续的控制器.结果如图:
顺便说一句,这个表单登陆是之间用tiles框架中定义好的样式完成的.再一次体现了tiles框架的好处.
用户输入用户密码,提交之后,跳到相应的控制器中,进行用户名和密码的判定.判定逻辑为如果用户名和数据库中的用户名比对之后发现数据库中没有该用户,则挑战到注册页面(该功能还未实现).如图
如果数据库中有该用户,则判断数据库中的密码和用户输入的密码是否相同,如果相同,则跳转到登陆前的页面,如果不相同,则依然通过拦截器将请求发送到登陆页面.
登录控制器的代码如下:
其中跳转回原来的页面是通过request.getHeader("Referer")实现的,Referer记录了上一个页面的url全称,所以在跳转是用redirect重定向.
数据库中用户密码表的字段设计如下:
二.明天的计划
1.今天的登陆功能中没有实现登录时间的更新,明天加上该功能
2.学习cookie以及MD5加密,实现MD5对用户username和login_at的加密,使用cookie
3.今天的密码输入错误,重新输入时没有提示语,明天如果有时间,将该功能完善.
三.遇到的问题
从今天的学习来看,自己对HttpRequest对象,HttpResponse对象以及HttpSession对象中的方法掌握并不多,后续需要更加深入的学习.
四.收获
以上
评论