Spring拦截器搭配注解,实现redis缓存数据
比如用户短时间内多次刷新页面,或app短时间多次请求新内容,可以使用redis缓解请求压力
首先自定义注解
/** * 标注在controller 进行缓存 ,其他情况不进行 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Cache { //默认缓存时间 60秒 String time() default "60"; }
注册config类
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; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private RedisCacheInterceptor redisCacheInterceptor; @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.tokenInterceptor).addPathPatterns("/**"); registry.addInterceptor(this.redisCacheInterceptor).addPathPatterns("/**"); } }
注册拦截器
import cn.hutool.crypto.digest.DigestUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import @Cache 包路径; import org.apache.commons.lang3.StringUtils; 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; import java.io.IOException; /** * request的拦截器,全局全内容缓存 * 关联注解@Cache */ @Component public class RedisCacheInterceptor implements HandlerInterceptor { @Value("${tanhua.cache.enable}") private Boolean enable; @Autowired RedisTemplate<String,String> redisTemplate; private static final ObjectMapper MAPPER= new ObjectMapper(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { if (!enable){ return true; } if (!(handler instanceof HandlerMethod)){ return true; } //判断是不是Get请求 if (!((HandlerMethod)handler).hasMethodAnnotation(GetMapping.class)){ return true; } //controller未加Cache注解 if (!((HandlerMethod)handler).hasMethodAnnotation(Cache.class)){ return true; } //从缓存中取 String redisKey = createRedisKey(request); String data = redisTemplate.opsForValue().get(redisKey); //缓存中没有 if (StringUtils.isEmpty(data)){ return true; } //缓存中有 response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().write(data); return false; } /** * 拼接成唯一的redisKey * @param request * @return * @throws JsonProcessingException */ public static String createRedisKey(HttpServletRequest request) throws JsonProcessingException { String url = request.getRequestURI(); String param = MAPPER.writeValueAsString(request.getParameterMap()); String token = request.getHeader("Authorization"); String data = url +"_" + param + "_" +token; return "SERVER_CACHE_DATA_"+ DigestUtil.md5Hex(data); } }

浙公网安备 33010602011771号