我的个人项目里有很多地方都要判断微信openid:
openid是否为空
openid字符串是否合法
openid是否在缓存中存在
openid是否在数据库中存在
openid对应的用户是否在有效期内
这就导致每次写个方法都要写一堆校验。
于是就想使用一个注解+拦截器的做法去实现。
@Inherited @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface AnnCheckUserInfo { boolean checkFormat() default true; boolean checkExistInDB() default true; boolean checkNotExpired() default true; }
@Component @Slf4j public class CheckUserInfoInterceptor extends HandlerInterceptorAdapter { @Autowired private RedisCache redisCache; @Autowired private SanshugptChatKeysDao sanshugptChatKeysDao; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {//isAssignableFrom()判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口(isAssignableFrom()方法是判断是否为某个类的父类) //HandlerMethod 封装方法定义相关的信息,如类,方法,参数等 HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); // 获取方法中是否包含注解 AnnCheckUserInfo methodAnnotation = method.getAnnotation(AnnCheckUserInfo.class); String methodName = method.getName(); if (methodAnnotation != null) { if (StrUtil.isNotBlank(methodName)) { // 业务实现 } } } } }
package cn.sanshu.webchat.core; @Slf4j @Component public class WebMvcConfig implements WebMvcConfigurer { @Autowired private CheckUserInfoInterceptor checkUserInfoInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { log.info("注册拦截"); registry.addInterceptor(checkUserInfoInterceptor); } }
这样就可以实现注解拦截器了。