# 拦截器

![](/files/-LdqfF07LuhIK01fgGQz)

## 1. 定义拦截器

```java
package com.example.demo.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import lombok.extern.slf4j.Slf4j;


@Slf4j
public class FirstInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        log.info("first intercrptor preHandle ...");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        log.info("first intercrptor postHandle ...");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        log.info("first intercrptor afterCompletion ...");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }



}
```

## 2. 注册拦截器

```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.example.demo.interceptor.FirstInterceptor;

@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {

    @Bean
    public HandlerInterceptor firstInterceptor() {
        return new FirstInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 由于拦截器加载是在springContext创建之前完成的，如果直接new AuthInterceptor，那么在拦截器中注入实体就为会null
        registry.addInterceptor(firstInterceptor()).addPathPatterns("/**");
    }
}
```

## 3. 测试

```
2019-05-02 11:17:35.300  INFO 23821 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor preHandle ...
2019-05-02 11:17:35.313  INFO 23821 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor postHandle ...
2019-05-02 11:17:35.313  INFO 23821 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor afterCompletion ...
```

## 4. 多个拦截器顺序

* 处理器前方法采用先注册先执行
* 处理器后方法和完成方法采用先注册后执行的顺序

![](/files/-Ldqd4nMxjSIks_2y19J)

```java
package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.example.demo.interceptor.FirstInterceptor;
import com.example.demo.interceptor.PrometheusInterceptor;

@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {

    @Bean
    public HandlerInterceptor firstInterceptor() {
        return new FirstInterceptor();
    }
    @Bean
    public HandlerInterceptor prometheusInterceptor() {
        return new PrometheusInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(firstInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(prometheusInterceptor()).addPathPatterns("/**");
    }
}
```

```
2019-05-02 11:22:48.165  INFO 24828 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor preHandle ...
2019-05-02 11:22:48.165  INFO 24828 --- [nio-8080-exec-1] c.e.d.interceptor.PrometheusInterceptor  : Prometheus intercrptor preHandle ...
2019-05-02 11:22:48.179  INFO 24828 --- [nio-8080-exec-1] c.e.d.interceptor.PrometheusInterceptor  : Prometheus intercrptor postHandle ...
2019-05-02 11:22:48.179  INFO 24828 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor postHandle ...
2019-05-02 11:22:48.179  INFO 24828 --- [nio-8080-exec-1] c.e.d.interceptor.PrometheusInterceptor  : Prometheus intercrptor afterCompletion ...
2019-05-02 11:22:48.179  INFO 24828 --- [nio-8080-exec-1] c.e.demo.interceptor.FirstInterceptor    : first intercrptor afterCompletion ...
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sb-woms.gitbook.io/sb/filter-and-interceptor/interceptor.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
