如何使用springboot定义登陆拦截器并配置拦截器

说明

  • 此演示的是前后端项目分离,所以存在跨域问题
  • 登陆方式使用的是单点登陆,所以使用到redis
  • redis中的key是token,value是用户对象
  • 用户在一个项目登陆过则会生成token放入redis中,时效期一般是30分钟(可自定义),后端把此token返回给浏览器cookie中存储
  • 单点登陆,可以一次登录后,在多个项目中无需再次登陆就可以默认是登录状态访问,因为多个项目共用一个redis,每个项目的登陆拦截器只要通过前端传过来的token在redis中查找是否有用户对象来判断是否放行即可,

定义登陆拦截器

  • 因为是前后端分离的项目,在拦截器中,先放行跨域预请求,解决跨域问题
  • 通过HandlerMethod对象,可以指定是否有贴在方法上的自定义登陆权限注解
  • 通过前端传过来的token在redis中查找是否有用户对象,有则放行
/**
 * spring拦截器操作过程解释:
 * 1.spring web容器启动之后, 解析所有controller类贴了@RequestMapping注解请求映射方法,
 * 并将这些请求映射方法信息封装成独立对象:HandlerMethod
 * 2.spring为了方便管理这些请求映射方法信息封装对象,定义一个类似于map集合来管理这些对象:
 * key:请求映射方法路径            value:请求映射方法信息封装对象(HandlerMethod实例)
 * 3.此时请求进入前端控制器.springmvc会解析请求,获取到请求路径:/user/currentUser(举例),
 * 然后通过路径获取当前请求映射方法信息封装对象 HandlerMethod handlerMethod = map.get("/user/currentUser");
 * 4.调用拦截器的preHandler执行拦截逻辑(以下类执行此逻辑)
 */
public class CheckLoginInterceptor implements HandlerInterceptor {

    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//      解决跨域问题
//        springmvc拦截资源类型3种
//        1.静态资源,handler对象就不是HandlerMethod实例
//        2.跨域预请求,handler对象也不是HandlerMethod实例
//        3.动态请求(映射方法),handler就是HandlerMethod实例
        if (!(handler instanceof HandlerMethod)){//HandlerMethod:请求映射方法信息(方法所在类,方法信息,映射路径,方法注解,方法参数...)封装对象
            return true;
        }

        String token = request.getHeader("token");
        UserInfo user = userInfoRedisService.getUserByToken(token);//刷新30分钟时效

//        判断当前请求对应请求映射方法是否贴@RequireLogin标签6
        HandlerMethod hm = (HandlerMethod) handler;
        if (hm.hasMethodAnnotation(RequireLogin.class)) {
//            如果贴了注解,进行登录效验
            if (user == null) {
                //返回Json格式.没有登录提示
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().write(JSON.toJSONString(JsonResult.noLogin()));
                return false;
            }
        }

//        放行
        return true;
    }
}

配置拦截器

  • 贴上@Configuration定义配置类,实现WebMvcConfigurer接口
  • @Bean配合@Configuration使用,将拦截器交给spring管理
@Configuration
public class WebConfig implements WebMvcConfigurer{

//    配置登录拦截器
    @Bean
    public CheckLoginInterceptor checkLoginInterceptor(){
        return new CheckLoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(checkLoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/users/checkPhone")
        .excludePathPatterns("/users/sendVerifyCode")
        .excludePathPatterns("/users/regist")
        .excludePathPatterns("/users/login");

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值