九点钟☆方向

记录成长点滴

欢迎来到我的个人博客~


SpringMVC笔记(五) SpringMVC拦截器

目录

拦截器

拦截器的作用

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

用户可以自己定义一些拦截器来实现特定的功能。

谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。 说到这里,可能大家脑海中有了一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但 是也有区别,接下来我们就来说说他们的区别:

过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。

拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp, html,css,image 或者 js 是不会进行拦截的。

它也是 AOP 思想的具体应用。

我们要想自定义拦截器, 要求必须实现: HandlerInterceptor 接口

自定义拦截器的步骤

编写类实现 HandlerInterceptor 接口

public class MyInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) throws Exception {
        System.out.println("preHandle 拦截器拦截了");
        return true;
    }

    public void postHandle(HttpServletRequest request, 
                           HttpServletResponse response, Object handler, 
                           ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 方法执行了");
    }

    public void afterCompletion(HttpServletRequest request, 
                                HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion 方法执行了");
    }
}

boolean preHandle方法在调用controller方法之前执行返回true时才会继续执行如果有下一个拦截器则执行下一个拦截器如果没有拦截器了则执行控制器方法返回false则不会往下执行

void postHandle方法controller方法执行后在向页面跳转之前执行即返回ModelAndView之前执行该方法可以修
改处理器方法的处理结果数据且可以修改跳转方向

void afterCompletion方法controller方法完全执行完即页面跳转后执行此时对 ModelAndView 再操作也对响应无济于事可以在该方法中进行一些资源清理的操作

SpringMVC配置文件配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!--要拦截的URL,/** 表示拦截所有方法-->
        <mvc:mapping path="/**"/>
        <!--也可以配置哪些URL不拦截-->
        <!--<mvc:exclude-mapping path="/test/*"/>-->
        <bean id="myInterceptor" class="com.mg.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

多个拦截器

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

5

编写两个拦截器类,并在配置文件中分别配置即可

拦截器类
public class HandlerInterceptorDemo1 implements HandlerInterceptor {//三个方法}
public class HandlerInterceptorDemo2 implements HandlerInterceptor {//三个方法}
配置文件:
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
        <bean id="handlerInterceptorDemo1"
              class="com.mg.interceptor.HandlerInterceptorDemo1"></bean>
    </mvc:interceptor>
    
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean id="handlerInterceptorDemo2"
              class="com.mg.interceptor.HandlerInterceptorDemo2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦