spring使用注解编写拦截器

springboot spring java 文章 2024-02-02 13:42 108 0 全屏看文

AI助手支持GPT4.0

我的个人项目里有很多地方都要判断微信openid:

  1. openid是否为空

  2. openid字符串是否合法

  3. openid是否在缓存中存在

  4. openid是否在数据库中存在

  5. 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;
}


然后在要使用的地方加上注解:

image.png


接着我开始写我的拦截器:

@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);
    }
}


这样就可以实现注解拦截器了。

-EOF-

AI助手支持GPT4.0