カスタム利点注釈+インターセプター
操作やインタフェースのニーズの権利または同様のユーザーインタフェース需要を制限することに、すべてではありません。あなたは、フィルタやインターセプタを使用することができますが、これは、構成ファイルまたは使用ワイルドカード内のすべてのメソッドで結合されなければなりません。
達成するために、カスタム注釈を加えた春のインターセプタを使用した:比較的簡単で柔軟な方法を使用することが可能です。
サンプルを書きます
たとえば、私たちは今、ちょうどこのように、あなたがコメントを追加することができ、制限カウンタのインタフェースになりたいです。seconds秒、最大容量MAXCOUNTあたりとして定義されます。
@AccessLimit(seconds=5, maxCount=5)
@RequestMapping(value="/path", method=RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(...) {
// 业务逻辑代码
}
次のように注意が定義されています。
@Retention(RUNTIME)
@Target(METHOD)
public @interface AccessLimit {
int seconds();
int maxCount();
}
インターセプタで注釈を有効に使用しています。
@Service
public class AccessInterceptor extends HandlerInterceptorAdapter{
@Autowired
RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(handler instanceof HandlerMethod) {
MiaoshaUser user = getUser(request, response);
UserContext.setUser(user);
HandlerMethod hm = (HandlerMethod)handler;
AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);
if(accessLimit == null) {
return true;
}
int seconds = accessLimit.seconds();
int maxCount = accessLimit.maxCount();
String key = request.getRequestURI();
Integer count = redisService.get(key);
if(count == null) {
// 定义一个seconds有效期的key
redisService.set(key, 1, seconds);
}else if(count < maxCount) {
redisService.incr(key);
}else {
return false;
}
}
return true;
}
}
最後に、私の経験は限られたレベルに制限され、読者は歓迎貴重な提案や意見のテキストのコメントがあります。あなたはより多くのリソースを取得したり、一緒に多くの技術の愛好家の交流を勉強したいしたい場合は、私は公共の数に焦点を当てることができ、「自然食品エンジニアXiaohui、」背景キーワードは、フロントとバックエンド技術交換基に、学習教材を受け取り、プログラマ返信副業グループ。為替で735 764 906:プログラマは、グループ副業Qグループに参加することができます。