限制POST请求

时间:2017-05-12 19:01:05

标签: java spring

我为counter实现了一个int变量。由于我只有POST方法,因此我无法再将forgetPasswordCounter设置为0.这就是为什么它无法正常工作的原因。我究竟如何限制请求?

@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);
  }
}

2 个答案:

答案 0 :(得分:1)

事实上,我认为你没有采取好办法来解决你的问题......

首先,在你的控制器中有一个静态计数器不是一个好主意。显示spring文档部分“Bean范围”。 您可以将其保存在数据库中,并通过“globalServices”示例访问它。

无论如何,我想你希望有多个用户,所以你需要通过用户名来获得这个计数器 - &gt;在你的状况之前。

然后,不要使用“while”循环指令而不是“if”。

最后,您可以定义重新初始化,而不是使用简单的计数器,该重新初始化会考虑上次授权密码发送的日期(这是一个简单的建议,有很多可能的策略可以做到这一点)

答案 1 :(得分:1)

您的Client应该拥有count并制作类似的内容。将此保存在数据库上的原因很简单,如果您的应用程序发生了某些事情并且您需要重新启动,或者由于某种原因服务器因某些原因而失败,您不会丢失任何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);
    }