• 利用拦截器与自定义注解实现未登录拦截


           发现公司项目里面实现登录拦截用的是自定义注解,一直没搞懂流程,最近闲来无事研究一番,发现是和拦截器配合着使用,就又巩固了一下拦截器的知识,为了登录效果又研究了一下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

    希望本篇文章对你有所帮助,不足之处欢迎指出,谢谢!

     

  • 相关阅读:
    Ubuntu中开启Telnet服务
    单片机串口通讯RXD与TXD如何对接详解
    KEIL, a Smart Comliler
    linux mail 命令(转载)
    VC程序在没装VC的机器中运行
    srand()以及rand()函数用法
    VC菜菜鸟:基于CFree的HelloWorld程序
    Keil使用中的若干问题(转)
    VMWARE 重新安装出错
    Linux个人学习笔记(编辑中)
  • 原文地址:https://www.cnblogs.com/ajax-li/p/7773281.html
Copyright © 2020-2023  润新知