springBoot实现拦截器

本文详细介绍了SpringBoot中拦截器的配置和使用,包括如何定义拦截器、配置拦截器路径以及如何通过自定义注解实现特定方法的拦截取消。拦截器主要在Controller方法执行前后进行操作,如权限验证、日志记录等。同时,文章还展示了如何避免静态资源被拦截的方法。
摘要由CSDN通过智能技术生成

/*和/**的区别

	1. /*  拦截文件夹     /A   /login
	2. /** 拦截文件夹和子文件夹   /A   /A/B    /login   /list/addLogin

拦截器

拦截器的原理也是AOP的一种实现,可以拦截对动态资源的后台请求,拦截控制层。

使用

1、定义拦截器

定义拦截器,只需要实现 HandlerInterceptor 接口, HandlerInterceptor 接口是所有自定义拦截
器或者 Spring Boot 提供的拦截器的鼻祖,该接口中有三个方法:
preHandle(……) 、 postHandle(……) 和 afterCompletion(……) 。

	1. preHandle(......)方法:当url已经匹配到controller层中某个方法时,在方法执行前执行
	它会决定是否放行,返回true,放行,返回false,不会执行
	2.  postHandle(……) 方法:url 匹配到Controller 中的某个方法,且执行完了该方法,
	但是在 DispatcherServlet 视图渲染之前执行。在这个方法中有个 ModelAndView 参数,可以在此做一些修改动作。
	3. afterCompletion(……) 方法:在整个请求处理完成后(包括视图渲染)执行,
	做一些资源的清理工作,这个方法只有在 preHandle(……) 被成功执行后并且返回true才会被执行。
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        log.debug("方法名:{}",methodName);
        // 通过方法,可以获取该方法上的自定义注解,然后通过注解来判断该方法是否要被拦截
        // @AbolishInterceptor 是自定义的注解
        AbolishInterceptor annotation = method.getAnnotation(AbolishInterceptor.class);
        log.info("annotation===============,{}",annotation);
        if (annotation != null) {
            return true;
        }
        String token = request.getParameter("token");
        if(token==null || "".equals(token)){
            log.info("未登录");
            return false;
        }
        // 返回true才会继续执行,返回false则取消当前请求
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //log.info("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //log.info("整个请求都处理完,DispatcherServlet也渲染了对应的视图,此时做一些清理的工作了");
    }
}

2、配置拦截器

在 Spring Boot 2.0 之前,我们都是直接继承 WebMvcConfigurerAdapter 类,然后重写addInterceptors 方法来实现拦截器的配置。但是在 Spring Boot 2.0 之后,该方法已经被废弃了,取而代之的是WebMvcConfigurationSupport 方法,如下:

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        List<String> pathPatterns = Lists.newArrayList();
        pathPatterns.add("/**");
		//addPathPatterns()添加拦截请求,/**拦截所有请求
        registry.addInterceptor(new MyInterceptor()).addPathPatterns(pathPatterns);
        super.addInterceptors(registry);
    }

    /**
     * 指定静态资源不被拦截,extends WebMvcConfigurationSupport,继承的方式会导致静态资源拦截,
     * 如果改为实现接口的方式就不会被拦截 implements WebMvcConfigurer
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
}
3、定义注解取消拦截
/**
 * 该注解用来指定某个方法不用拦截
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AbolishInterceptor {
}

在controller层中取消拦截的方法中添加该注解,然后在拦截器处理方法中添加取消拦截的逻辑

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        log.debug("方法名:{}",methodName);
        // 通过方法,可以获取该方法上的自定义注解,然后通过注解来判断该方法是否要被拦截
        // @AbolishInterceptor 是自定义的注解
        AbolishInterceptor annotation = method.getAnnotation(AbolishInterceptor.class);
        log.info("annotation===============,{}",annotation);
        if (annotation != null) {
            return true;
        }
        // 返回true才会继续执行,返回false则取消当前请求
        return true;
    }
Spring Boot实现拦截器的过程可以参考中提供的详细示例代码解析。在Spring Boot中,可以通过创建一个自定义的拦截器类来实现拦截功能。拦截器类需要实现Spring框架中的HandlerInterceptor接口,并重写其中的方法。 首先,需要创建一个拦截器类,该类需要实现HandlerInterceptor接口,并重写其中的preHandle、postHandle和afterCompletion方法。preHandle方法在请求处理之前执行,可以用于进行权限验证、日志记录等操作;postHandle方法在请求处理之后执行,可以对响应结果进行处理;afterCompletion方法在视图渲染之后执行,可以进行一些资源的清理操作。 接下来,需要在Spring Boot应用程序的配置类(通常是带有@SpringBootApplication注解的类)中注册拦截器。可以通过重写WebMvcConfigurer接口中的addInterceptors方法来实现。在该方法中,可以使用addInterceptor方法将自定义的拦截器类添加到拦截器链中,指定需要拦截的路径或排除的路径。 通过以上步骤,就可以实现拦截器在Spring Boot应用中的使用了。拦截器会在请求到达控制器方法之前进行拦截,并执行拦截器类中定义的相关逻辑。 需要注意的是,拦截器在Spring Boot中是针对Spring MVC的访问进行增强的,与Servlet技术中的过滤器(Filter)有所区别。拦截器通过动态拦截方法调用的机制来实现,而过滤器对所有访问进行增强。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值