APIインタフェースのデザイン冪等

1は、APIインタフェース設計冪等、つまり、そのデータが一意であることを確認するために、重複を許可していません。

     たとえば:RPCリモート呼び出し、ネットワーク待ち時間ので、二回と呼ばれるケースで登場しました。

                連続フォームをクリックして、提出が繰り返されてきました。

                インターフェイスへの曝露後に、ツールは、要求(Jemterなど)攻撃シミュレートすることができます。

2、どのようにインターフェースや他の設計、それの電源を確保するには?

      使用トークンの実施形態の前に、インタフェースAPI(フォーム送信)への各呼び出しは、API呼び出しがトークン生成、またトークンRedisの格納されているクライアント記憶へのトークン、Redisの有効期間は、約15〜60分間、設けら​​れていてもよいです

      フォームが送信されると、リクエストヘッダは、トークン内のリクエストヘッダをトークン行うべきトークン内部Redisのが比較され、Redisのトークンがあり、フォームが送信され、同時に、トークン削除、Redisのその後形ではない、ノーあります提出。

3、トークンを生成する際に、クライアントが保存されたインデックスメソッドを呼び出して、postIndexインタフェースの呼び出しの前に、トークンの検証を提出クリック

4、Redisのインストール

RedisのをRedisのに基づく5は、キャッシュ・トークンを書きます

パッケージcom.aiyuesheng.util。

輸入java.util.concurrent.TimeUnit。

輸入org.springframework.beans.factory.annotation.Autowired;
輸入org.springframework.data.redis.core.StringRedisTemplate。
輸入org.springframework.stereotype.Component。

@Component 
パブリック クラスBaseRedisService { 

    @Autowired 
    プライベートStringRedisTemplate stringRedisTemplate。

    公共 ボイドsetStringの(文字列キー、オブジェクトデータ、ロングタイムアウト){
         場合(データのinstanceof 文字){ 
            String値 = (文字列)データ。
            stringRedisTemplate.opsForValue()セット(キー、値)。
        } 
        場合(タイムアウト!= NULL ){ 
            stringRedisTemplate.expire(キー、タイムアウト、TimeUnit.SECONDS)。
        } 
    } 

    パブリックオブジェクトのgetString(文字列キー){
         戻り)(stringRedisTemplate.opsForValueを(キー)を得ます。
    } 

    公共 ボイドdelKey(文字列キー){ 
        stringRedisTemplate.delete(キー)。
    } 

}

 

パッケージcom.aiyuesheng.util。

輸入java.util.UUID。

輸入org.apache.commons.lang.StringUtils。
輸入org.springframework.beans.factory.annotation.Autowired;
輸入org.springframework.stereotype.Component。

@Component 
パブリック クラスRedisToken { 
    @Autowired 
    プライベートBaseRedisService baseRedisService。

    プライベート 静的 最終 長い TIMEOUT =(60 * 60 * 60 )。

    パブリック文字列setToken(){ 
        文字列トークン =のSystem.currentTimeMillis()+ "" + UUID.randomUUID()。 
        baseRedisService.setString(トークン、トークン、TIMEOUT)。
        返すトークン; 
    } 

    パブリック文字列入手トークン(文字列tokenKey){
         場合(!{StringUtils.isEmpty((文字列)baseRedisService.getString(tokenKey)))
             リターン(文字列)baseRedisService.getString(tokenKey)。
        } 
        リターン「」
    } 
}

図6に示すように、各時間の比較。検証

 

おすすめ

転載: www.cnblogs.com/pickKnow/p/11266654.html
おすすめ