我为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);
}
}
答案 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);
}