发现公司项目里面实现登录拦截用的是自定义注解,一直没搞懂流程,最近闲来无事研究一番,发现是和拦截器配合着使用,就又巩固了一下拦截器的知识,为了登录效果又研究了一下SSO单点登录,所以demo里面用到了同域SSO的单点登录,其实就是cookie的使用,父域SSO,和跨域SSO,这里不做详细讲解,有兴趣的小伙伴可以上慕课网搜索,有详细的课程讲解,废话不多说,下面开始。
一:拦截器
拦截器需要先配置,配置的方法有好几种。
第一种:拦截所有的url
<mvc:interceptors>
<bean class="com.itmyhome.MyInterceptor" />
</mvc:interceptors>
第二种:拦截匹配的URL
<mvc:interceptors>
<mvc:interceptor>
// 拦截器的url
<mvc:mapping path="/user/**" />
//拦截器走的方法
<bean class="customerAnnotation.CheckLoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors> -->
第三种:HandlerMappint上的拦截器
<!-- 登录拦截器 所有方法拦截-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="customerAnnotation.CheckLoginInterceptor"/>
</list>
</property>
</bean>
注意:
如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以给interceptors属性注入拦截器了。
拦截器类:拦截器需要继承HandlerInterceptorAdapter这个类并重写其三个方法
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
参数中的Object handler是下一个拦截器。
最主要的方法是preHandle方法
如果方法返回false 从当前拦截器往回执行所有拦截器的afterCompletion方法,再退回拦截器链 如果返回true 执行下一个拦截器,
直到所有拦截器都执行完毕 再运行被拦截的Controller 然后进入拦截器链从最后一个拦截器往回运行所有拦截器的postHandle方法
接着依旧是从最后一个拦截器往回执行所有拦截器的afterCompletion方法
二:自定义注解
接下来开始代码编写
先自定义一个注解:
这样就可以了
接下来写一个请求方法类:
这个注解的拦截逻辑写在我们拦截器里面
拦截器配置:我这里用的是第三种方法
CheckLoginInterceptor方法:
我这里就是判断session里面有没有login这个session,如果有则判定为登录,也可以用cookie,这些都是其次,主要的用途和流程就是这样了,当你想让一个
类是在登录的情况下才能访问时,就只要给它添加一个@CheckLogin(value = CheckLogin.WEB)注解就可以了,就是这么简单。
下面把登录相关的代码也贴出来吧:
需要demo的可以发邮件给我liri_1024@163.com
希望本篇文章对你有所帮助,不足之处欢迎指出,谢谢!