SpringMVC拦截器

关于SpringMVC拦截器的认识,此处记录网上学习的笔记

  • 什么是拦截器?

拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。

  • 过滤器
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFiletr</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>
  • 拦截器的实现
  1. 编写拦截器类实现HandlerInterceptor接口
  2. 将拦截器注册进SpringMVC框架中
  3. 配置拦截器的拦截规则
<mvc:interceptors>    
      <!-- 用于统计访问首页的拦截器 -->
      <mvc:interceptor>
          <mvc:mapping path="/"/> <!-- 可以拦截多个请求 -->
          <mvc:mapping path="/front/*"/>
          <bean class="org.hnjy.core.server.model.HomepageInterceptor"></bean>
      </mvc:interceptor>
</mvc:interceptors>

 

  • 拦截器需实现 HandlerInterceptor
  1.  返回值:表示是否需要将当前的请求拦截下来
  2. 如果返回false,请求将被终止
  3. 如果返回true,请求会被继续运行
  4. Object arg2表示的是被拦截的请求的目标对象
public class HomepageInterceptor implements HandlerInterceptor {
    @Override
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        //afterCompletion方法主要用于资源的销毁,流的关闭,比较少用
        //System.err.println("执行到了afterCompletion方法");
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        //System.err.println("执行到了postHandle方法");
    }

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        //System.err.println("执行到了preHandle方法");
        return true;
    }
}
  • 在一个应用中如何配置多个拦截器?

  • 拦截器的其它实现方式

拦截器的类还可以通过实现WebRequestInterceptor接口来编写,向SpringMVC注册的写法不变,弊端是preHandle方法没有返回值,不能终止请求

  • 配置拦截器,实现过滤器的功能
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        //System.err.println("执行到了preHandle方法");
        arg0.setCharacterEncoding("utf-8");
        return true;
}
  • 拦截器的使用场景
  1. 解决乱码问题 
  2. 解决权限验证问题
  • 拦截器和过滤器的区别
  1. 过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大
  2. 拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求
  • 总结

拦截器可以处理Web应用中请求的一些通用性问题,共性问题在拦截器中处理,可以减少代码重复,便于维护

 

posted @ 2018-11-01 20:53  轻风偷走了酒  阅读(71)  评论(0)    收藏  举报