当前位置: 代码网 > it编程>编程语言>Java > SpringMVC框架自定义拦截器的过程详解

SpringMVC框架自定义拦截器的过程详解

2025年11月24日 Java 我要评论
一、拦截器1. 概述springmvc框架中的拦截器用于对处理器(controller层)进行预处理和后处理的技术。可以定义拦截器链,拦截器链就是将拦截器按着一定顺序结成一条链,在访问被拦截的方法中,

一、拦截器

1. 概述

  1. springmvc框架中的拦截器用于对处理器(controller层)进行预处理后处理的技术。
  2. 可以定义拦截器链,拦截器链就是将拦截器按着一定顺序结成一条链,在访问被拦截的方法中,拦截器链中的拦截器会按着定义的顺序执行
  3. 拦截器也是aop思想的一种实现方法。
  4. 想要自定义拦截器,需要实现handlerinterceptor接口

2. handlerinterceptor接口中的方法

  1. prehandle方法:是执行controller方法前拦截的方法
    • 可以使用request或response跳转到指定的页面。
    • return true拦截,放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法
    • return false拦截,不放行不执行controller中的方法
  2. posthandle方法:是执行controller方法后拦截的方法,在jsp视图执行前
    • 可以使用request或response跳转到指定的页面。
    • 如果跳转到指定的页面,那么controller方法跳转的页面将不会显示。
  3. aftercompletion方法:是jsp执行后在执行的方法
    • request或response不能再跳转页面了。

3. 拦截器执行流程图

4. 拦截器和过滤器的区别

  1. 过滤器是servlet规范的一部分,任何框架都可以使用过滤器。
  2. 拦截器是springmvc框架独有的。
  3. 过滤器配置/*,可以拦截任何资源。
  4. 拦截器只会对控制器中的方法进行拦截

二、自定义拦截器

1. 配置一个拦截器

处理器(controller层)中的方法

import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;
@requestmapping("/dept")
@controller
public class deptcontroller {
    /**
     * 测试方法
     * @return
     */
    @requestmapping("/findall.do")
    public string findall(){
        system.out.println("测试拦截器,执行了……");
        return "suc";
    }
}

创建拦截器类,实现handlerinterceptor接口,重写需要的方法

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.myinterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

在springmvc.xml文件中配置拦截器

import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
/**
 * 拦截器类
 */
public class myinterceptor implements handlerinterceptor {
    /**
     * 拦截器之前:拦截controller中的findall方法,放行,执行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws exception
     */
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("myinterceptor中的拦截器prehandle方法执行了……");
        // return false - 拦截,不放行;return true - 拦截,放行
        return true;
    }
    /**
     * 拦截器之后:controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelandview
     * @throws exception
     */
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
        system.out.println("myinterceptor中的posthandle方法执行了……");
        // 可以进行页面跳转
        request.getrequestdispatcher("/pages/suc.jsp").forward(request,response);
        return;
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws exception
     */
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
        system.out.println("myinterceptor中的aftercomplrtion方法执行了……");
    }
}

输出结果:

myinterceptor中的拦截器prehandle方法执行了……
测试拦截器,执行了……
myinterceptor中的posthandle方法执行了……
myinterceptor中的aftercomplrtion方法执行了……

2. 配置多个拦截器

再编写一个拦截器类

import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
/**
 * 拦截器类
 * 配置多个拦截器
 */
public class myinterceptor2 implements handlerinterceptor {
    /**
     * 拦截controller中的方法,但放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws exception
     */
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("myinterceptor2的拦截器prehandle方法执行了……");
        // 放行
        return true;
    }
    /**
     * controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelandview
     * @throws exception
     */
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
        system.out.println("myinterceptor2的posthandle方法执行了……");
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws exception
     */
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
        system.out.println("myinterceptor2的aftercomplrtion方法执行了……");
    }
}

再springmvc.xml文件中配置多个拦截器类

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.myinterceptor"></bean>
    </mvc:interceptor>
    <!--配置拦截器2-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/**"/>
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.myinterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

输出结果

myinterceptor中的拦截器prehandle方法执行了……
myinterceptor2的拦截器prehandle方法执行了……
测试拦截器,执行了……
myinterceptor2的posthandle方法执行了……
myinterceptor中的posthandle方法执行了……
myinterceptor2的aftercomplrtion方法执行了……
myinterceptor中的aftercomplrtion方法执行了……

到此这篇关于springmvc框架 - 拦截器的文章就介绍到这了,更多相关springmvc拦截器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com