SpringBoot采用拦截器进行redis缓存命中(自定义注解+拦截器+向redis中加数据)
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);
}}