java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring拦截器HandlerInterceptor使用

Spring拦截器之HandlerInterceptor使用方式

作者:?abc!

这篇文章主要介绍了Spring拦截器之HandlerInterceptor使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

概述

有时候我们需要进行一些预处理后处理,或者是拦截请求,在请求前后后做一些处理

使用Spring MVC框架,那么建议使用HandlerInterceptor,它可以类似于普通bean直接注册到Spring容器中被管理

HandlerInterceptor的三个抽象方法

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

preHandle

在执行Handler之前(执行业务逻辑之前),根据拦截器链顺序执行

该方法的返回值是布尔值Boolean 类型的,

postHandle

在执行Handler成功(执行业务逻辑成功)之后,根据拦截器链倒序执行,如果前面的流程中抛出异常或者请求被拦截则不会执行!

afterCompletion

在请求处理完毕之后执行,无论是否有响应视图,无论有没有通过preHandle,无论有没有抛出异常。

只会对此前放行成功(preHandle返回true)的拦截器进行倒序调用。

使用

构建拦截器(HandlerInterceptor )

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.gildata.gup.domain.User;
import com.gildata.gup.domain.UserEncryptReset;
import com.gildata.gup.repository.UserEncryptResetRepository;

@Component // 不可少
public class xxxStateInterceptor implements HandlerInterceptor { // 必须实现HandlerInterceptor接口

    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        // ....
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        return;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
    }
}

注册拦截器(WebMvcConfigurerAdapter )

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.gildata.gup.interceptor.PasswordStateInterceptor;

@Configuration // 配置
public class WebConfigfilter extends WebMvcConfigurerAdapter{
    
    @Autowired
    private XxxStateInterceptor xxxStateInterceptor ; // 实例化拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // super.addInterceptors(registry);
        // 注册自定义的拦截器passwordStateInterceptor
        registry.addInterceptor(xxxStateInterceptor)
            .addPathPatterns("/api/*") //匹配要过滤的路径
            .excludePathPatterns("/api/changeUser/*") //匹配不过滤的路径。/api/changeUser后面的所有接口不能拦截
            .excludePathPatterns("/api/getAge", "/api/getName") // /api/getAge也不能拦截,/api/getName这个接口的请求不能拦截
    }
}

两个常用方法:

注意

springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:

但是,继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效,所以 建议用实现WebMvcConfigurer接口的方式 。

所以上面的注册拦截器更改为:

@Configuration // 配置
public class WebConfigfilter implements WebMvcConfigurer{
    
    @Autowired
    private XxxStateInterceptor xxxStateInterceptor ; // 实例化拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // super.addInterceptors(registry);
        // 注册自定义的拦截器passwordStateInterceptor
        registry.addInterceptor(xxxStateInterceptor)
            .addPathPatterns("/api/*") //匹配要过滤的路径
            .excludePathPatterns("/api/changeUser/*") //匹配不过滤的路径。/api/changeUser后面的所有接口不能拦截
            .excludePathPatterns("/api/getAge", "/api/getName") // /api/getAge也不能拦截,/api/getName这个接口的请求不能拦截
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文