SpringMVC拦截器 - 简讲

SpringMVC-Interceptor

拦截器的作用

  • SpringMVC的拦截器类似于Servlet开发中过滤器Filter,用于对处理器进行预处理后处理
  • 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

拦截器和过滤器的区别

区别过滤器(Filter)拦截器(Interceptor)
使用范围是servlet规范中的一部分,任何Java Web工程都可以使用是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
拦截范围在url-pattern中配置了/*之后,可以对所有要访问的资源拦截在<mvc:mapping path=“”/>中配置了/**之后,也可以多所有资源文件进行拦截,但是可以通过<mvc:exclude-mapping path=“”/>标签排除不需要拦截的资源

拦截器的快速入门

  1. 创建拦截器类实现HandlerInterceptor接口

    • public class MyInterceptor1 implements HandlerInterceptor {
          /**在目标方法执行之前执行*/
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("preHandle...");
              return true;
          }
          /**目标方法执行之后视图返回之前执行*/
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("postHandle...");
          }
          /**在整个流程都执行完毕后 执行*/
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("afterCompletion...");
          }
      }
      
  2. 配置拦截器

    • <!--配置拦截器-->
      <mvc:interceptors>
          <mvc:interceptor>
              <!--对那些资源执行拦截操作-->
              <mvc:mapping path="/**"/>
              <bean class="com.ytzl.interceptor.MyInterceptor1"/>
          </mvc:interceptor>
      </mvc:interceptors>
      
  3. 测试拦截器的拦截效果

    • @RequestMapping("/show")
      public ModelAndView show(){
          System.out.println("目标资源执行");
          ModelAndView modelAndView = new ModelAndView();
          modelAndView.addObject("name","玫瑰无原则");
          modelAndView.setViewName("index");
          return modelAndView;
      }
      
    • <h1>你是我值得一生去观望的烟火,可惜最后只能在记忆中临摹。---${name}</h1>
      

详解

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--对那些资源执行拦截操作-->
        <mvc:mapping path="/**"/>
        <bean class="com.ytzl.interceptor.MyInterceptor1"/>
    </mvc:interceptor>

    <mvc:interceptor>
        <!--对那些资源执行拦截操作-->
        <mvc:mapping path="/**"/>
        <bean class="com.ytzl.interceptor.MyInterceptor2"/>
    </mvc:interceptor>
</mvc:interceptors>

像此多个拦截器会依次从上往下执行

/**在目标方法执行之前执行*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandle...");
    String name = request.getParameter("name");
    if (name.equals("我想你了")){
        return true;
    }else {
        request.getRequestDispatcher("/error.jsp").forward(request,response);
        return false;//返回true代表放行,false不放行
    }
}
/**目标方法执行之后视图返回之前执行*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    modelAndView.addObject("name","是小星星呀....");
    System.out.println("postHandle...");
}

在拦截之后进行判断,放行后进行修改视图属性值

知识小结

拦截器方法说明

方法名说明
preHandle()方法将在请求处理之前调用,返回值boolean,返回true即放行,反之拦截并要设置转发页面
postHadnle()方法将在请求处理之后被调用,前提是preHandle()放行后才能被调用,且会在DispatcherServlet进行视图返回值渲染之前被调用
,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
afterCompletion()该方法将在整个请求结束之后,也就是DispatcherServlet渲染了对应的视图之后执行,前提是preHandle放行后才能被调用

自定义拦截器步骤

  1. 创建拦截器类实现HandlerInterceptor接口
  2. 配置拦截器
  3. 测试拦截器的拦截效果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值