Spring Boot2.x.x全局拦截器

Spring Boot2.x.x全局token拦截器

Result 自定义封装请看另外的文章 Result封装

TokenInterceptorHandler.java

java 复制代码
package com.sky.handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sky.result.Result;
import com.sky.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

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

@Slf4j
@Component
public class TokenInterceptorHandler implements HandlerInterceptor {

  private static final ObjectMapper objectMapper = new ObjectMapper();

  @Resource
  private RedisUtils redisUtils;

  private boolean writeJson(HttpServletResponse response, Result<?> result) throws Exception {
    response.setStatus(HttpStatus.UNAUTHORIZED.value());
    response.setContentType("application/json;charset=UTF-8");
    response.getWriter().write(objectMapper.writeValueAsString(result));
    return false;
  }

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

    String token = request.getHeader("Authorization");
    return true; // 接全部接口不做检验 如果需要检验接口 把下面注释的放开
//    // 如果请求不需要登录,可在这里设置白名单
//    String uri = request.getRequestURI();
//    if (uri.startsWith("/public") || uri.equals("/login")) {
//      return true;
//    }

//    if (token == null || token.isEmpty()) {
//      return writeJson(response, Result.unauthorized("未登录"));
//    }
//
//    String key = redisUtils.getRedisName() + token;
//    String userJson = (String) redisUtils.get(key);
//    if (userJson == null) {
//      return writeJson(response, Result.unauthorized("登录已过期"));
//    }
//
//    // 可在这里把用户信息放入 request,方便 Controller 使用
//    request.setAttribute("userInfo", userJson);
//
//    return true; // token 校验通过
  }
}

WebConfig.java

java 复制代码
package com.ruoyi.sky.config;

import com.ruoyi.sky.handler.TokenInterceptorHandler;
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.WebMvcConfigurer;

import java.io.Serializable;

//@Configuration // 配置类通常使用@Configuration注解进行标记,表示该类是一个配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
  private final TokenInterceptorHandler tokenInterceptorHandler;

  @Autowired
  public WebConfig(TokenInterceptorHandler tokenInterceptorHandler) {
    this.tokenInterceptorHandler = tokenInterceptorHandler;
  }

/*
	addPathPatterns("/**") 表示所有路径都会进入拦截器。
	excludePathPatterns(...) 表示这些路径不拦截。
*/
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(tokenInterceptorHandler)
        .addPathPatterns("/**")
        .excludePathPatterns(
            "/admin/employee/login",
            "/logout",
            "/public/**",
            "/swagger-ui/**",
            "/v2/api-docs",
            "/webjars/**"
        );
  }
}

RedisUtils.java 封装

java 复制代码
package com.sky.utils;

import com.sky.constant.RedisConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {
  @Autowired
  private RedisTemplate redisTemplate;

  /**
   * 写入缓存(默认不过期)
   */
  public void set(String key, Object value) {
    redisTemplate.opsForValue().set(key, value);
  }

  /**
   * 写入缓存,并设置过期时间(单位:秒)
   */
  public void set(String key, Object value, long timeoutSeconds) {
    redisTemplate.opsForValue().set(key, value, timeoutSeconds, TimeUnit.SECONDS);
  }

  /**
   * 获取缓存
   */
  public Object get(String key) {
    return redisTemplate.opsForValue().get(key);
  }

  /**
   * 删除缓存
   */
  public void delete(String key) {
    redisTemplate.delete(key);
  }

  /**
   * 判断 key 是否存在
   */
  public boolean exists(String key) {
    return Boolean.TRUE.equals(redisTemplate.hasKey(key));
  }

  public String getRedisName() {
    return RedisConstant.REDIS_KEY; // 返回的是列如 login:user:
  }
}
相关推荐
鱼跃鹰飞3 分钟前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes
Coder_Boy_8 分钟前
Spring Boot 事务回滚异常 UnexpectedRollbackException 详解(常见问题集合)
java·spring boot·后端
青云交9 分钟前
Java 大视界 -- 基于 Java+Redis Cluster 构建分布式缓存系统:实战与一致性保障(444)
java·redis·缓存·缓存穿透·分布式缓存·一致性保障·java+redis clus
风象南9 分钟前
SpringBoot 实现网络限速
后端
不知疲倦的仄仄10 分钟前
第五天:深度解密 Netty ByteBuf:高性能 IO 的基石
java·开源·github
xiaobaishuoAI13 分钟前
后端工程化实战指南:从规范到自动化,打造高效协作体系
java·大数据·运维·人工智能·maven·devops·geo
源代码•宸14 分钟前
Golang语法进阶(定时器)
开发语言·经验分享·后端·算法·golang·timer·ticker
期待のcode16 分钟前
TransactionManager
java·开发语言·spring boot
Hello.Reader17 分钟前
PyFlink JAR、Python 包、requirements、虚拟环境、模型文件,远程集群怎么一次搞定?
java·python·jar
计算机学姐18 分钟前
基于SpringBoot的汽车租赁系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·spring·汽车·推荐算法