spring boot配置拦截器代码实例

  

下面我将为你详细讲解如何实现Spring Boot配置拦截器的完整攻略。

1. 准备工作

首先,你需要创建一个Spring Boot项目,可以使用Spring Initializr快速生成模板。然后,你需要在pom.xml文件中添加spring-boot-starter-webspring-boot-starter-test依赖。

2. 创建拦截器

在Spring Boot项目中,我们可以通过实现HandlerInterceptor接口来创建一个拦截器。具体步骤如下:

2.1 创建拦截器类

创建一个名为DemoInterceptorJava类,该类实现HandlerInterceptor接口,如下所示:

@Component
public class DemoInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求URL:" + request.getRequestURL());
        return true;
    }

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

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

2.2 配置拦截器

在Spring Boot的配置文件application.properties中配置拦截器:

spring.mvc.interceptor.include=/**
spring.mvc.interceptor.exclude=

其中,include属性表示要拦截的请求路径,exclude属性表示要排除的请求路径。

实际开发中,我们一般只需要配置include属性,例如:

spring.mvc.interceptor.include=/api/**

这表示只对以/api开头的请求进行拦截。

2.3 注册拦截器

我们需要将创建好的拦截器注册到Spring Boot中,在Spring Boot应用启动时自动加载。可以使用WebMvcConfigurer来完成拦截器的注册。

@Configuration
public class DemoInterceptorConfig implements WebMvcConfigurer {

    @Autowired
    DemoInterceptor demoInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(demoInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

在上面的示例中,我们将DemoInterceptor注册到Spring Boot中,并通过addPathPatternsexcludePathPatterns方法分别指定了要拦截的请求路径和排除的请求路径。

3. 测试拦截器

在完成了上述步骤后,我们就可以测试创建的拦截器是否生效了。可以通过如下的代码进行测试:

@RestController
@RequestMapping("/api")
public class DemoController {

    @GetMapping("/sayHello")
    public String sayHello() {
        return "Hello, World!";
    }

    @GetMapping("/login")
    public String login() {
        return "Login Success!";
    }
}

在上面的示例中,我们定义了两个请求路径:/api/sayHello/api/login。其中,前者是需要被拦截的,后者是被排除的。

我们使用Postman等HTTP客户端发送请求,观察控制台输出是否有请求URL:/api/sayHello的信息输出。如果有,则说明我们的拦截器已经生效。

4. 示例说明

上面的示例只是简单演示了如何实现一个简单的请求拦截器,实际开发中,我们可能需要处理更为复杂的场景。下面给出另外两个示例:

示例1:统计请求处理时间

@Component
public class TimerInterceptor implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(getClass());
    private final ThreadLocal<Long> timeThreadLocal = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        timeThreadLocal.set(System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long interval = System.currentTimeMillis() - timeThreadLocal.get();
        logger.info("请求URL:{} 处理时间:{}ms", request.getRequestURL(), interval);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        timeThreadLocal.remove();
    }
}

在上述示例中,我们实现了一个拦截器,用于统计请求处理时间。

示例2:鉴权拦截器

@Component
public class AuthInterceptor implements HandlerInterceptor {

    private final static String AUTH_HEADER = "Authorization";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(AUTH_HEADER);
        if (StringUtils.isEmpty(token)) {
            throw new RuntimeException("未登录");
        }

        // 解析token,判断token是否合法

        return true;
    }

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

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

在上述示例中,我们实现了一个拦截器,用于鉴权。该拦截器会检查请求头中的Authorization字段,如果该字段不存在或未携带合法的token,则抛出未登录异常。

总结

通过上述攻略的介绍,我们可以了解到如何在Spring Boot中实现拦截器,以及拦截器在实际开发中的使用场景。由于拦截器的使用场景较多,本文仅仅提供了一些简单的示例,读者可以根据实际情况进行拓展。

相关文章