欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring MVC的拦截器

程序员文章站 2022-03-25 17:17:38
原文链接:http://www.yiidian.com/springmvc/interceptor.html Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日 ......

原文链接:

spring mvc中的拦截器(interceptor)类似于servlet中的过滤器(filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

要使用spring mvc中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。

通过实现handlerinterceptor接口
继承handlerinterceptor接口的实现类(如:handlerinterceptoradapter)来定义。

1 编写目标控制器

首先,为了演示spring mvc拦截器的效果,我们先定义一个目标控制器

hellocontroller目标控制器:

package com.yiidian.controller;
import org.springframework.stereotype.controller;
import org.springframework.ui.model;
import org.springframework.ui.modelmap;
import org.springframework.web.bind.annotation.requestbody;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.responsebody;
import org.springframework.web.multipart.multipartfile;

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpsession;
import java.io.*;
import java.util.uuid;

/**
 * 目标控制器
 * 一点教程网 - www.yiidian.com
 */
@controller
public class hellocontroller {

    @requestmapping("/hello")
    public string upload(httpsession session, httpservletresponse response) throws exception {
        system.out.println("3.目标控制器-hellocontroller");
        return "success";
    }
}

2 编写自定义拦截器

这里我们定义2个spring mvc拦截器,而且这2个拦截器同时拦截器一个目标控制器,大家注意看最后的执行顺序。

demo1interceptor第一个拦截器:

package com.yiidian.interceptor;

import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
/**
 *  自定义拦截器
 *一点教程网 - www.yiidian.com
 */
public class demo1interceptor implements handlerinterceptor{
    /**
     *prehandle: 在控制器(目标)的方法之前被执行
     *   返回值:控制aftercompletion方法是否被执行
     *       true: 执行aftercompletion
     *       false: 不执行aftercompletion
     */
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("1.demo1interceptor的prehandle");
        return true;
    }

    /**
     * posthandle: 在控制器(目标)的方法成功执行完成之后(注意:控制器方法失败不执行)
     */
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
        system.out.println("5.demo1interceptor的posthandle");
    }

    /**
     *  aftercompletion: 在执行完前面所有(拦截器和目标)的方法之后执行(注意: 不管控制器方法执行成功与否都会被执行 )
     */
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
        system.out.println("7.demo1interceptor的aftercompletion");
    }
}

demo2interceptor第二个拦截器:

package com.yiidian.interceptor;

import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

/**
 *  自定义拦截器
 *一点教程网 - www.yiidian.com
 */
public class demo2interceptor implements handlerinterceptor{
    /**
     *prehandle: 在控制器(目标)的方法之前被执行
     *   返回值:控制aftercompletion方法是否被执行
     *       true: 执行aftercompletion
     *       false: 不执行aftercompletion
     */
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("2.demo2interceptor的prehandle");
        return true;
    }

    /**
     * posthandle: 在控制器(目标)的方法成功执行完成之后(注意:控制器方法失败不执行)
     */
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
        system.out.println("4.demo2interceptor的posthandle");
    }

    /**
     *  aftercompletion: 在执行完前面所有(拦截器和目标)的方法之后执行(注意: 不管控制器方法执行成功与否都会被执行 )
     */
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
        system.out.println("6.demo2interceptor的aftercompletion");
    }
}

注意:一个拦截器和多个拦截器的执行顺序看下图。

一个拦截器的执行顺序:

Spring MVC的拦截器

多个拦截器的执行顺序:

Spring MVC的拦截器

3 springmvc.xml配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 配置2个拦截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean class="com.yiidian.interceptor.demo1interceptor"/>
    </mvc:interceptor>

    <mvc:interceptor>
        <mvc:mapping path="/hello"/>
        <bean class="com.yiidian.interceptor.demo2interceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

注意:拦截器配置的顺序决定了拦截器的执行顺序,先配置会先被执行!

4 运行测试

访问:

控制台输出效果如下:

Spring MVC的拦截器

源码下载:https://pan.baidu.com/s/1myzqcpvlhvb4ajkb5aucdq

Spring MVC的拦截器

欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站: