Spring Boot 配置拦截器

更新时间: 2021-03-21 17:29:35   作者: 异常教程网

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观

本节中,您将学习如何在 Spring Boot 2.0 中配置拦截器。通过拦截器,我们可以针对特定 URI 做拦截,做相关业务处理,比如检查用户是否登录,打印每个请求的处理耗时等。

接下来,先让我们新建一个 Web 项目

一、新建一个拦截器

新建登录验证类 LoginValidationInterceptor.java:

package site.exception.springbootinterceptor.interceptor;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import site.exception.springbootinterceptor.entity.User;

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

/**
 * @author www.exception.site (exception 教程网)
 * @date 2019/2/27
 * @time 12:19
 * @discription 登录验证拦截器
 **/
public class LoginValidationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle ...");
        User user = (User) request.getSession().getAttribute("user");
        if (user == null) {
            // 若未登录,重定向到登录页面
            response.sendRedirect("login.html");
            return false;
        }
        // 若已登录,继续往下执行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ...");
        // controller 方法调用完毕后,执行此方法
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("afterCompletion ...");
        // 页面渲染完成后调用此方法, 一般用来清除某些资源等
    }
}

定义一个拦截器类后,您需要实现 HandlerInterceptor 接口,其有三个方法可以重写:

  • preHandle: 在调用 Controller 方法之前,执行此方法;
  • postHandle: 在调用 Controller 方法之后,页面渲染之前,执行此方法,通常您可以在此方法中将渲染的视图名称更改为其他视图名称;
  • afterCompletion: 此方法在页面渲染完毕之后被调用;

二、配置拦截器

上面,您已经定义好一个登陆拦截的拦截器了,接下来,需要做一下全局配置。

新建 WebMvcConfig.java 配置类:

package site.exception.springbootinterceptor.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import site.exception.springbootinterceptor.interceptor.LoginValidationInterceptor;

/**
 * @author www.exception.site (exception 教程网)
 * @date 2019/2/27
 * @time 12:17
 * @discription
 **/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 配置拦截器
     * @param interceptorRegistry
     */
    @Override
    public void addInterceptors(InterceptorRegistry interceptorRegistry) {
        // 拦截所有 /admin/** 的访问地址
        interceptorRegistry.addInterceptor(new LoginValidationInterceptor()).addPathPatterns("/admin/**");
    }
}

到此,一个简单的拦截器就配置完成了!

GitHub 源码

https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-interceptor