Java拦截器使用流程详解

1.实现拦截器接口

创建一个类实现HandlerInterceptor接口(Spring MVC)或框架对应的拦截器接口,重写关键方法

如下:

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogInterceptor implements HandlerInterceptor {

    // 请求到达Controller前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求开始: " + request.getRequestURI());
        request.setAttribute("startTime", System.currentTimeMillis());
        return true; // 返回true继续执行,false终止请求
    }

    // Controller处理完毕后、视图渲染前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long startTime = (Long) request.getAttribute("startTime");
        System.out.println("请求处理耗时: " + (System.currentTimeMillis() - startTime) + "ms");
    }

    // 请求完全结束后执行(视图渲染完毕)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求结束");
    }
}

2.注册拦截器

将拦截器添加到Spring MVC配置中,指定拦截路径和排除路径

一般有两种方式

1:java配置类(推荐)

注意:

在下面的addInterceptors方法中,可以多次调用registry.addInterceptor()来注册多个拦截器.每个拦截器都可以独立配置自己独立的拦截路径和排除规则,并且可以指定执行顺序

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

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/**")           // 拦截所有路径
                .excludePathPatterns("/static/**"); // 排除静态资源
    }
}

2:使用XML配置

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/static/**"/>
        <bean class="com.example.LogInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

3:控制拦截器执行顺序

当有多个拦截器 ,可以通过Order注解或实现Ordered接口指定顺序

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor()).order(1); // 先执行
        registry.addInterceptor(new LogInterceptor()).order(2);   // 后执行
    }
}
posted @ 2025-03-21 20:37  留梦&  阅读(62)  评论(0)    收藏  举报