当前位置: 移动技术网 > IT编程>开发语言>Java > Spring MVC的拦截器

Spring MVC的拦截器

2020年03月22日  | 移动技术网IT编程  | 我要评论

原文链接:

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");
    }
}

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

一个拦截器的执行顺序:

file

多个拦截器的执行顺序:

file

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 运行测试

访问:

控制台输出效果如下:

file

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

file

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网