2017-05-12 15 views
1

私はカウンタにint変数を実装しました。私はPOSTメソッドしか持っていないので、再びforgetPasswordCounterを0に設定することはできません。そのため、私はどのくらい正確に動作しません。どのようにリクエストを制限することができますか?実際にPOSTリクエストの制限

@Controller 
public class Controller { 
    private static int forgetPasswordCounter = 0; 

    @RequestMapping(value = "/forgetpassword", method = RequestMethod.POST) 
    public ResponseEntity <String> forgetPassword(@RequestParam(value = "username") String username) throws Exception { 
    while (forgetPasswordCounter < 3) { 
     Client foundUser = globalServices.findClientByUsername(username);  
     if (null != foundUser) { 
     ... 
     forgetPasswordCounter++; 
     return new ResponseEntity <String> (responseMessage, HttpStatus.OK); 
     } 
     ... 
     forgetPasswordCounter++; 
     return new ResponseEntity <String> (responseMessage, HttpStatus.UNAUTHORIZED); 
    } 
    String responseMessage = "Too many requests"; 
    return new ResponseEntity <String> (responseMessage, HttpStatus.BAD_REQUEST); 
    } 
} 
+0

のカウントを失うことはありませんあなたがすることはできませんユーザー名とカウンタを追加してマップにしますか? また、最後に試してから何回試してから、必要に応じてリセットするかを指定することもできます。 –

+1

いつパスワードカウンタをリセットしますか?そして、なぜあなたは 'HttpStatus.OK'の値を0に設定していませんか – jiveturkey

+0

IMOデータベースにこの数を保存しておき、' Client'を取得したら、カウントが3より小さいかどうかを確認できます –

答えて

1

、私はあなたの問題を解決するための良い方法を取ることはありませんだと思う...

まず、あなたのコントローラ内の静的カウンタは良いアイデアではありません持っています。春のドキュメンテーションのセクション「Beanスコープ」を表示してください。 データベースに保存し、例として "globalServices"を介してアクセスできます。

とにかく、複数のユーザーがいると思いますので、このカウンターをユーザー名 - >前提条件で取得する必要があります。

次に、 "if"の代わりに "while"ループ命令を使用しないでください。

最後に、簡単なカウンタを使用するのではなく、あなたが送信し、最後の許可パスワードの日付を占める取る再初期化を定義することができます(それが可能な戦略の多くが行う簡単なアドバイスがあるされている)

+0

あなたの良いアドバイスをありがとうございます。それは私をたくさん助ける – Eniss

1

あなたClientcountがあり、このようなものにする必要があります。何かがあなたのアプリケーションに起こる場合は、データベース上で、これを保存する理由は、単純であり、あなたが再起動する必要があるか、サーバーが何らかの理由で降りる場合は、任意のClient

public ResponseEntity <String> forgetPassword(@RequestParam(value = "username") String username) throws Exception { 
     Client foundUser = globalServices.findClientByUsername(username);  
     if(foundUser.getCountOfForgetPassword() <= 3){ 
      globalServices.updateCountOfForgetPassword(++foundUser.getCountOfForgetPassword()); 
      return new ResponseEntity <String> (responseMessage, HttpStatus.OK); 
     } 
     String responseMessage = "Too many requests"; 
     return new ResponseEntity <String> (responseMessage, HttpStatus.BAD_REQUEST); 
    } 
+0

答えをありがとう。上記のあなたのコメントに関しては、私が実装しようとしたこの方法でスパムメールを受信することを少なくとも避けることができたと思いました。私はいくつかの有名なウェブサイトで、私がリクエストボタンをクリックすると(パスワードを忘れるなど)3-4回、サーバは429のステータスエラーを出し、10-15分後にリクエストボタンをクリックできたことをテストしました。 – Eniss

+0

日付があまりに早すぎるとブロックすることができたら、 'lastTimeOfRequest'のような日付を保存することができます。これを行うには他の方法はわかりません。 –

関連する問題