springmvc拦截器

1. 定义

  • 定义拦截器,实现HandlerInterceptor接口,接口中提供三个方法

    public class HandlerInterceptor1 implements HandlerInterceptor {
    //进入Handler方法之前执行
    //应用场景:用于身份认证,身份授权
    //比如省份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    
        //return false表示拦截,不向下执行
        //return true 表示放行
        return false;
    }
    //进入Handler方法之后,返回ModelAndView之前
    //应用场景:从ModelAndView触发,将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
    }
    //执行Handler完成后执行
    //应用场景:统一异常处理,统一日志处理
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }
    }

2. 拦截器配置

  • 当配置多个拦截器时,只要有一个不放行就不会执行postHandle
2.1 springmvc拦截器针对HandlerMapping进行拦截配置
  • 如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的Handler最终使用该拦截器
  • 代码(不常用):
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="interceptor">
            <list>
                <ref bean="handlerInterceptor1" />
                <ref bean="handlerInterceptor2" />
            </list>
        </property>
    </bean>
        <bean id="handlerInterceptor1" class="com.voion.ssm.HandlerInterceptor1" />
        <bean id="handlerInterceptor2" class="com.voion.ssm.HandlerInterceptor2" />
2.2 类似全局的拦截器
  • springmvc配置类似全局的拦截器,Springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中
    <!-- 拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器,顺序执行 -->
        <mvc:interceptor>
            <!-- /**表示所有url包括url子路径 -->
            <mvc:mapping path="/**"/>
            <bean class="com.voion.ssm.interceptor.HandlerInterceptor1"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.voion.ssm.interceptor.HandlerInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3. 拦截器的应用

  • 例1:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器连接中第一个位置
  • 例2:登录认证拦截器,放在拦截器连接中第一个位置,权限校验拦截器放在登录认证拦截器之后(因为登录通过后才校验权限)
3.1 实现登录认证
  • 用户请求url
  • 拦截器拦截校验
    • 如果请求的url是公开地址,无需登录即可访问的url,让放行
    • 用户session不存在,跳转登录页面
    • 如果用户session存在放行,继续操作

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">



 

posted @ 2019-01-22 04:29  kasi  阅读(136)  评论(0编辑  收藏  举报