ホームページ  >  記事  >  ウェブフロントエンド  >  spring-aop がネットワークリクエストの繰り返し送信を防ぐ方法

spring-aop がネットワークリクエストの繰り返し送信を防ぐ方法

坏嘻嘻
坏嘻嘻オリジナル
2018-09-14 15:03:461820ブラウズ

具体的な原理は非常に単純で、リクエストが開始されるとリクエストパラメータが変換され、存在する場合はエラーが報告されます。リクエストが完了すると保存され、削除されます。

具体的なコードは次のとおりです:
1. コメント @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. Spring アスペクトと周囲の通知

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. ##In 必要なメソッドに @NotDuplicate

を追加します

関連する推奨事項:


Spring 管理 MongoDB

Mongodb 統合 Spring の例

以上がspring-aop がネットワークリクエストの繰り返し送信を防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。