Spring boot集成拦截器

一、创建登陆拦截器

  • 每一个拦截器都需要实现的 HandlerInterceptor 接口,这个接口有三个方法
    1、preHandle( Controller方法处理之前调用)
    2、postHandle(Controller方法处理完之后,DispatcherServlet进行视图的渲染之前调用)
    3、afterCompletion(视图的渲染之后调用)

  • 但三个方法并不需要全都实现,原因是接口通过default关键字修饰之后,可以给接口添加默认实现,对于实现这个接口的所有实现类,可以自己选择是否要覆盖接口,这是JDK8之后新增的语法点
    在这里插入图片描述

  • 该语法的实际应用,某项目线上已运行几年,项目一版一版迭代,某个模块需要新增功能,该模块代码结构如下:
    1、 一个接口定义了一系列规范,该接口目前有20个实现类
    2、完成当前功能需要需要接口规范,新增几个接口方法;但是并不是所有的实现类需要实现
    3、如果解决?
    方案一: 使用default关键词,修饰新增方法避免所有实现类都需要修改
    方案二: 用一个抽象类实现接口,其他实现类继承抽象类

  • 新建一个 intercepors 包,用来装拦截器。然后在拦截器下新建 LoginInterceptor,用来拦截验证登陆。

  • 以登录拦截为例,该拦截需要在接口调用之前拦截请求,判断是否登陆,所以这里需要使用 preHandle 方法,在里面写验证逻辑,最后返回 true 或者 false,确定请求是否合法。

import com.example.tokenlogindemo.entity.User;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author Mi
 * @version 1.0
 * @description: TODO
 * @date 2022/1/7 17:37
 */
public class LoginInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        if (user == null){
            //返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
            //也可以利用response给用户返回一些提示信息,提示未登陆
            return false;
        }else {
            return true;    //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
        }
    }

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

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

二、在WebConfigurer中添加拦截器

在这里插入图片描述

  • 创建WebConfigurer 类
  • 将 LoginInterceptor 注入到 WebConfigurer 中
  • 在 WebConfigurer 中设置拦截放行,addPathPatterns 用来设置拦截路径,excludePathPatterns 用来设置放行路径。
import com.example.tokenlogindemo.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/** 
 * @author Mi
 * @version 1.0
 * @description: TODO
 * @date 2022/1/7 17:45
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    //将 LoginInterceptor 注入到 WebConfigurer 中
    @Autowired
    private LoginInterceptor loginInterceptor;
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       	//在 WebConfigurer 中的 addInterceptors 中添加拦截,放行
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示对登录注册放行
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");
        
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值