springmvc框架(八)——拦截器

拦截器的概述

1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。

2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链 中的拦截器会按着定义的顺序执行。

3. 拦截器和过滤器的功能比较类似,有区别 :

  1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。

  2. 拦截器是SpringMVC框架独有的。

  3. 过滤器配置了/*,可以拦截任何资源。

  4. 拦截器只会对控制器中的方法进行拦截。

4. 拦截器也是AOP思想的一种实现方式

5. 想要自定义拦截器,需要实现HandlerInterceptor接口。

自定义拦截器的步骤

1. 创建两个拦截器,实现HandlerInterceptor接口,重写需要的方法

/**
 * 自定义拦截器1
 */
public class MyInterceptor1 implements HandlerInterceptor {
    /**
     * 预处理,controller方法执行前
     * return true 表示放行,执行下一个拦截器,如果没有下一个拦截器,则执行controller中的方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("myinterception1执行了。。。前111");
        return true;
    }

    /**
     * 后处理方法,controller方法执行后,success.jsp之情之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("myinterception1执行了。。。后111");
    }

    /**
     * success.jsp页面执行后,该方法会执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception{
        System.out.println("myinterception1执行了。。。最后111");
    }

}

===================================

/**
 * 自定义拦截器2
 */
public class MyInterceptor2 implements HandlerInterceptor {

    /**
     * 预处理,controller方法执行前
     * return true 表示放行,执行下一个拦截器,如果没有下一个拦截器,则执行controller中的方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("myinterception2执行了。。。前222");
        return true;
    }

    /**
     * 后处理方法,controller方法执行后,success.jsp之情之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("myinterception2执行了。。。后222");
    }

    /**
     * success.jsp页面执行后,该方法会执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception{
        System.out.println("myinterception2执行了。。。最后222");
    }
}
View Code

2. 在springmvc.xml中配置拦截器类

    <!--配置拦截器-->
    <mvc:interceptors>
        <!--配置第一个拦截器-->
            <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法
            <mvc:exclude-mapping path=""/> -->
            <!--配置拦截器对象-->
            <bean class="com.churujianghudezai.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
        <!--配置第二个拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/**"/>
            <!--不要拦截的方法 <mvc:exclude-mapping path=""/> -->
            <!--配置拦截器对象-->
            <bean class="com.churujianghudezai.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>

注意:这里加粗的语句表示拦截器2是对所有控制器及方法进行拦截,path一定要写成 /**,少一个*都会报错!!!

3. 编写控制器

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor执行了...");
        return "success";
    }

}

4. 两个页面代码:

index.jsp

<body>
    <h3>拦截器</h3>
    <a href="user/testInterceptor" >拦截器</a>
</body>

================================

success.jsp

<body>
    执行成功!
    <% System.out.println("success.jsp执行了..."); %>
</body>

运行结果:

 

 

 

后台显示:

 

 

知识点说明:

HandlerInterceptor接口中的方法 :

1. preHandle方法是controller方法执行前拦截的方法

  1. 可以使用request或者response跳转到指定的页面

  2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

  3. return false不放行,不会执行controller中的方法。

2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。

  1. 可以使用request或者response跳转到指定的页面

  2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

3. postHandle方法是在JSP执行后执行

  1. request或者response不能再跳转页面了

多个拦截器的执行顺序:

多个拦截器是按照配置的顺序决定的。

 

 

posted @ 2020-05-11 22:09  大盘鸡嘹咋咧  阅读(213)  评论(0编辑  收藏  举报