Skip to content

在日常开发的时候有一些页面是不能直接访问的,因为需要某一些参数,需要进行验证之后才能继续访问,这时候就可以使用拦截器进行拦截

应用场景

  • 日志记录
  • 权限检查
  • 性能检测

实现

配置文件

xml
<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--要拦截的路径-->
        <mvc:mapping path="/路径"/>
        <!--放行路径-->
        <mvc:exclude-mapping path="/路径"/>
        <!--由哪个类负责拦截-->
        <bean class="类的全路径"/>
    </mvc:interceptor>
</mvc:interceptors>

一般拦截的路径是全部拦截,只放行一条路径用于做验证使用

Java代码

java
public class Login implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

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

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

preHandle():在请求被处理之前进行操作

postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可改变响应结果

afterCompletion():所有的请求响应结束后执行善后工作,清理对象,关闭资源

Spring-Boot实现

拦截器类跟上面一样,但是配置文件不再是以上方式,需要在类中编写,如:

java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import top.xmln.lookingservertoplay.interceptor.TokenInterceptor;

import java.util.List;

/**
 * @description: 配置MVC内容
 * @author: 曦暮流年
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 配置Token拦截器
        registry.addInterceptor(new TokenInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(List.of(
                        "/user/login",
                        "/user/register",
                        "/mail/sendMail"
                ));
    }
}