SpringBoot中HandlerInterceptor拦截器的构建详细教程

发布于:2024-05-08 ⋅ 阅读:(24) ⋅ 点赞:(0)
  1. 作用范围:拦截器主要作用于Spring MVC的DispatcherServlet处理流程中,针对进入Controller层的请求进行拦截处理。它基于Java的反射机制,通过AOP(面向切面编程)的思想实现,因此它能够访问Spring容器中的Bean,利用Spring的强大功能,如依赖注入、事务管理等。
  2. 实现方式:拦截器需要实现Spring的HandlerInterceptor接口或继承HandlerInterceptorAdapter类,并通过配置在Spring MVC的配置类中注册。
  3. 执行时机:拦截器的执行时机在Controller方法调用前后,以及视图渲染完成后,可以用来处理权限校验、日志记录、请求参数修改等。
  4. 依赖性:拦截器不依赖于Servlet容器,而是依赖于Spring框架。

拦截器通常用于处理业务逻辑相关的拦截,如权限检查、日志记录、事务管理等,更适合需要访问Spring容器中Bean的场景。

目录

拦截器实现案例:

1、创建一个名为UserInterceptor的类

2、进行拦截器配置:需要一个配置类

3、创建一个Controller类

4、启动主类


拦截器实现案例:

创建springboot项目,最终项目结构如下:

pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.softeem</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.softeem.springboot.SpringbootApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

1、创建一个名为UserInterceptor的类

实现Spring MVC框架中的HandlerInterceptor接口。这个接口是用来定义请求处理过程中的拦截器,可以在请求被处理之前、之后以及完成后执行一些自定义的操作。

public class UserInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器---------------------------");
        //编写业务拦截的规则
        User user = (User) request.getSession().getAttribute("user");

        if (user == null){
            response.sendRedirect(request.getContextPath() + "/user/error");
            return false;
        }
        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、进行拦截器配置:需要一个配置类

设置拦截器(Interceptor)以实现特定的请求处理逻辑。

@Configuration  //定义此类为配置文件(即相当于之前的xml配置文件)
public class InterceptorConfig implements WebMvcConfigurer {

    //mvc:interceptors
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //要拦截user下的所有访问请求,必须用户登录后才可访问,
        // 但是这样拦截的路径中有一些是不需要用户登录也可访问的
        String[] addPathPatterns = {
            "/user/**"
        };
        //要排除的路径,排除的路径说明不需要用户登录也可访问
        String[] excludePathPatterns = {
            "/user/out", "/user/error","/user/login"
        };
        //mvc:interceptor bean class=""
        registry.addInterceptor(new UserInterceptor()).
                addPathPatterns(addPathPatterns).
                excludePathPatterns(excludePathPatterns);
    }
}

详解:

类定义与注解

  • @Configuration:这是一个Spring框架的注解,用于指示当前类是一个配置类,相当于传统的XML配置文件。Spring会自动扫描并读取此类中的Bean定义和配置信息。
  • implements WebMvcConfigurer:表明InterceptorConfig类实现了WebMvcConfigurer接口。这个接口提供了自定义Spring MVC配置的方法,允许你在不继承WebMvcConfigurerAdapter或重写WebMvcConfigurationSupport的情况下扩展Spring MVC的功能。

方法重写:addInterceptors

  • addInterceptors方法是WebMvcConfigurer接口提供的,用于注册自定义的拦截器到Spring MVC中。当应用程序接收到HTTP请求时,这些拦截器会在请求到达具体控制器方法之前或之后执行预处理或后处理逻辑。

拦截规则定义

  • String[] addPathPatterns = { "/user/**" };:这部分定义了哪些URL路径需要被拦截器处理。/user/**是一个通配符模式,表示所有以/user/开头的URL都会被此拦截器拦截。
  • String[] excludePathPatterns = { ... }:这部分定义了需要从拦截规则中排除的路径。例如,/user/out, /user/error, /user/login等路径被排除,意味着这些URL请求不会经过拦截器,可以直接访问。这对于无需用户身份验证就能访问的页面(如登录页面)特别有用。

注册拦截器

  • registry.addInterceptor(...):通过InterceptorRegistry实例注册一个拦截器。这里使用的是new UserInterceptor(),意味着注册了一个名为UserInterceptor的拦截器实例。
  • .addPathPatterns(...) 和 .excludePathPatterns(...) 分别用来添加需要拦截的路径模式和需要排除的路径模式,前面定义的数组在这里被用作参数。

3、创建一个Controller类

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/login")
    public String login(){
        return "login success";
    }

    @RequestMapping("/center")
    public String center() {
        return "我被拦截了...不能显示";
    }

    @RequestMapping("/out")
    public String out(HttpSession session) {
        session.invalidate();
        return "我被排除拦截...可以显示 user/out";
    }

    //如果用户未登录访问了需要登录才可访问的请求,之后会跳转至该请求路径
    //该请求路径不需要用户登录也可访问
    @RequestMapping("/error")
    public String error() {
        return "被拦截:error";
    }
}

4、启动主类

上述配置类中将"/user/out", "/user/error","/user/login"排除掉了

首先尝试访问/user/out

访问user/center

被拦截且跳转user/error