SpringBoot采用拦截器进行redis缓存命中(自定义注解+拦截器+向redis中加数据)

时间:2025-03-10 11:31:42
package com.tanhua.server.interceptor; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.tanhua.common.utils.Cache; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component//普通类交给spring管理的表识 public class RedisCacheInterceptor implements HandlerInterceptor { //注入注解 @Value("${}") private Boolean enable; @Autowired RedisTemplate redisTemplate; private static final ObjectMapper objectMapper=new ObjectMapper(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //缓存全局开关校验 //如果开启就放行 if (!enable){ return true; } //判断是不是handler方法 if (!(handler instanceof HandlerMethod)){ return true; } //判断是get请求 if (!((HandlerMethod) handler).hasMethodAnnotation(GetMapping.class)){ return true; } //判断注解是否是@cache if (!((HandlerMethod) handler).hasMethodAnnotation(Cache.class)){ return true; } String redisKey=createRedisKey(request); String data = (String) this.redisTemplate.opsForValue().get(redisKey);//获取redis中的数据 //判断是否我空 if (data==null){ return true; } response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().write(data); // return false; } //定义一个生成redisKey的方法 public static String createRedisKey(HttpServletRequest request) throws JsonProcessingException { String url = request.getRequestURI(); String param = objectMapper.writeValueAsString(request.getParameterMap());//获取参数 String token = request.getHeader("Authorization");//获取token String data = url + "_" + param + "_" + token;//url+参数+token return "SERVER_CACHE_DATA_" + DigestUtils.md5Hex(data); }}