Spring学习笔记-第十天:Spring拦截器

六、SpringMVC拦截器

1.拦截器(interceptor)的作用

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

2.拦截器与过滤器的区别

servlet三大组件:servlet Listener filter

区别 过滤器 拦截器
使用范围 是servlet规范中的一部分,任何JavaWeb都可以使用 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用
拦截范围 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或是js是不会进行拦截的

3.拦截器快速入门

  1. 创建拦截器实现HandlerInterceptor接口
    //在目标方法执行之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        return false;
    }
    //在目标方法执行之后 视图返回之前执行
    @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...");
    }
  1. 配置拦截器-spring-mvc.xml
<!--    配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            代表对那些资源执行拦截操作-->
            <mvc:mapping path="/**"/>
            <bean class="com.itheima.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>
  1. 测试拦截器的拦截效果
    这时发现,没有显示出页面,控制台只打印了preHandle,这是因为preHandle函数默认返回false,表示方法被拦截

测试preHandle的拦截效果和postHandle的修改M&V效果

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...");
        //获取请求携带参数,括号内参数表示url输入时的变量参数
        String param = request.getParameter("param");
        //若写 param.equals()则不输入param时则报错,可能当读取不到时,param当主体调用参数会出错
        if("yes".equals(param)){
            return true;
        }
        else {
            //转发一下
            request.getRequestDispatcher("/error.jsp").forward(request,response);
            return false;
        }

    }
    //在目标方法执行之后 视图返回之前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        modelAndView.addObject("name","haijian");
        System.out.println("postHandle...");
    }

测试拦截器链的效果
preHandle...
pre222
目标资源执行......
post222
postHandle...
afterCompletion...

4.拦截器方法说明

方法名 说明
preHandle() 方法在请求处理之前调用,有bool类型返回值决定是否拦截,若为true,继续调用下一个preHandle方法
postHandle() 在当前请求处理后被调用,前提是true,且它会在DispatcherServlet进行视图返回渲染之前呗调用,所有可以在Controller处理之后的M&V对象进行操作
afterCompletion() 在DispatcherServlet渲染了对应的视图之后执行

5.知识要点

自定义拦截器步骤

  1. 创建拦截器类实现HandlerInterceptor接口
  2. 配置拦截器
  3. 测试拦截器拦截效果
posted @ 2021-05-08 23:41  东风应笑我  阅读(75)  评论(0)    收藏  举报