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

Spring拦截器Interceptor的使用

程序员文章站 2022-05-23 10:25:47
...

Spring的拦截器(HandlerInterceptor【接口–实现】/HandlerInterceptorAdapter【继承和重写相关的方法】)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @ClassName AuthorityInterceptor
 * @Author 莫邪
 * @Description TODO 拦截器
 * @Date Created in 18:48 2018/6/6
 * @Version 1.0
 */
@Component
public class AuthorityInterceptor implements HandlerInterceptor {


    @Override//在一个请求进入Controller层方法执行前执行这个方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在这里可以对参数做一些预处理和做一些验证
        return true;//方法给予执行,就是允许controller的方法进行执行
        //false 不允许,可以在这之前在reponse中编写返回的结果

    }
    //返回model前
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //Controller执行完毕后,返回之前,可以对request和reponse进行处理
        //如果是前后端没有分离,在进入View层中前执行
    }

    //返回model后
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //在一个请求处理完毕,即将销毁的时候,执行,可以做一些资源释放之类的工作
    }
}

写好代码还需要对其进行配置,如果有多个拦截器,拦截器的执行顺序是按照声明的顺序。
第一种配置方式
使用SpringBoot的话我们可以对其进行Java配置,需要和配置类同一个包下或者在其包下的子包中,不然得使用@ComponentScan(basePackages = {“com.”})开启注解扫描


/**
 * @ClassName MyConfig
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 19:06 2018/6/6
 * @Version 1.0
 */

import com.tmo.tmo_sms.Interceptor.AuthorityInterceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootConfiguration
@EnableAspectJAutoProxy
public class MyConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private AuthorityInterceptor authorityInterceptor;



    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorityInterceptor).addPathPatterns("/user/**");//配置拦截的路径,可以传多个参数
        /*registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");*/
    }
}

第二种配置方式,注意使用这种方式不需要再使用@Component在拦截器上声明
在spring 的配置文件中配置相关的配置,注意需要的配置文件声明

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
     http://www.springframework.org/schema/context  
     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
     http://www.springframework.org/schema/mvc  
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

然后可以在配置文件中进行相关的配置

<mvc:interceptors>  
    <!-- 使用 bean声明定义一个Interceptor,但是如果是直接定义在 mvc:interceptors 下面的 Interceptor将会拦截所有的请求 -->  
    <!--<bean class="com.xxx.xxx.AuthorityInterceptor"/> -->
    <mvc:interceptor>  
        <!--定义在这里的拦截器将会拦截特定的请求-->
        <mvc:mapping path="/user/**"/>  
        <bean class="com.hit.interceptor.LoginInterceptor"/>  
    </mvc:interceptor>  
</mvc:interceptors>  

先声明的拦截器将会先执行
下面定义一个拦截器栈,拦截顺序从上到下

<mvc:interceptors>
        <bean class="com.xxx.AAAInterceptor"/>
        <bean class="com.xxx.BBBInterceptor"/>
        <bean class="com.xxx.CCCInterceptor"/>
 </mvc:interceptors>