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に示すように、各時間の比較。。。検証