限制短信六十秒能只能发送一条
所谓限制短信发送频率 大体思路是 判断之前发送短信存储的ip在redis是否存在 若存在则拦截
实现 HandlerInterceptor
类
类中有三个方法分别是
- afterCompletion: controller执行之后 渲染视图之后
- postHandle: controller 执行之后 渲染视图之前
- preHandle: controller 执行之前
我们只要在controller执行之前 判断是否key是否存在 若存在返回false表示拦截 返回true表示通过
public class PassportInterceptor implements HandlerInterceptor {
@Autowired
protected RedisOperator redisOperator;
protected static final String MOBILE_SMS_CODE = "mobile_sms_code";
/**
* 进入controller之前拦截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userIp = IpUtil.getIp(request);
if (redisOperator.keyIsExist(MOBILE_SMS_CODE + ":" + userIp)) {
System.out.println("短信发送过于频繁");
return false;
} else {
return true;
}
}
}
之后写配置类 将拦截器注册并指明是那条路由匹配该拦截器
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public PassportInterceptor passportInterceptor() {
return new PassportInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(passportInterceptor())
.addPathPatterns("/passport/getSMSCode");
}
}
虽然道路是曲折的,但前途是光明的。