Maison  >  Article  >  interface Web  >  Comment Spring-Aop empêche la soumission répétée de requêtes réseau

Comment Spring-Aop empêche la soumission répétée de requêtes réseau

坏嘻嘻
坏嘻嘻original
2018-09-14 15:03:461783parcourir

Le principe spécifique est très simple. Grâce à la notification surround de spring-aop, lorsque la requête démarre, le paramètre de la requête sera converti pour vérifier s'il existe déjà, une erreur sera signalée. sera stocké et supprimé une fois la demande terminée.

Le code spécifique est le suivant :
1. Annotation @interface

package com.yuntu.commons.intelligent.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/**
 * Created by niuzy on 2018-09-13.
 */@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface NotDuplicate {}

2. Aspects printaniers et notifications environnantes

import com.yuntu.commons.ServiceException;import com.yuntu.commons.intelligent.ExceptionConstants;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.lang.reflect.Method;import java.util.Set;import java.util.concurrent.ConcurrentSkipListSet;/**
 * Created by niuzy on 2018-09-13.
 */@Aspect@Componentpublic class NotDuplicateAop {
    private Logger LOG = LoggerFactory.getLogger(NotDuplicateAop.class);    private static final Set<String> KEY =  new ConcurrentSkipListSet<>();    @Pointcut("@annotation(com.yuntu.commons.intelligent.annotation.NotDuplicate)")    public void duplicate() {
    }    /**
     * 对方法拦截后进行参数验证
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around("duplicate()")    public Object duplicate(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature msig = (MethodSignature) pjp.getSignature();
        Method currentMethod = pjp.getTarget().getClass().getMethod(msig.getName(), msig.getParameterTypes());        //拼接签名
        StringBuilder sb = new StringBuilder(currentMethod.toString());
        Object[] args = pjp.getArgs();        for (Object object : args) {            if(object != null){
                sb.append(object.getClass().toString());
                sb.append(object.toString());
            }
        }
        String sign = sb.toString();        boolean success = KEY.add(sign);        if(!success){            throw new ServiceException(ExceptionConstants.ILLEGAL_REQUEST_EXCEPTION,"该方法正在执行,不能重复请求");
        }        try {            return pjp.proceed();
        } finally {
            KEY.remove(sign);
        }

    }
}

3. . Utilisez :
Ajouter @NotDuplicate sur les méthodes requises

.

Recommandations associées :

Gestion Spring MongoDB

Exemple Spring d'intégration Mongodb

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn