美文网首页服务器后端开发JavaJava 杂谈
自定义注解+拦截器优化项目代码

自定义注解+拦截器优化项目代码

作者: 全菜工程师小辉 | 来源:发表于2019-06-11 13:35 被阅读0次

自定义注解+拦截器的优势

类似用户权限或者接口限流的需求,但并不是所有操作或者接口需要。可以使用过滤器或者拦截器,但这样就必须在配置文件里加上所有方法或者使用通配符。
所以可以采用一种比较简单灵活的方式:采用自定义注解加Spring拦截器来实现。

编写示例

例如我们现在要做个接口的计数器限流,只需要像下面这样,加上一个注解即可。定义为每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;
    }
}
哎呀,如果我的名片丢了。微信搜索“全菜工程师小辉”,依然可以找到我

相关文章

  • 自定义注解+拦截器优化项目代码

    自定义注解+拦截器的优势 类似用户权限或者接口限流的需求,但并不是所有操作或者接口需要。可以使用过滤器或者拦截器,...

  • Java 自定义注解及使用场景

    Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优...

  • Java自定义注解

    Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优...

  • Java实现自定义注解

    Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优...

  • 数据权限控制

    核心思想 通过Mybatis的拦截器重写sql 拦截器部分代码 权限类代码 自定义注解 数据权限处理接口 辅助类 ...

  • 登录拦截器

    定义注解和拦截器 自定义注解,对标记了注解的方法进行拦截 定义拦截器,根据注解进行方法拦截 配置拦截器 使用

  • springmvc无xml的拦截器配置

    配置拦截器,比如拦截登陆状态的这类拦截器。拦截特定的url 1.首先是拦截器代码 2.自定义的注解 3.配置拦截器...

  • mybatis(3)—自定义拦截器(上)基础使用

    mybatis自定义拦截器(一)基本使用mybatis自定义拦截器(二)对象详解 1. 拦截器注解 1. myba...

  • SpringBoot 注解调用Redis缓存

    注解代码: 利用拦截器处理注解中的方法,有就调用缓存,没有就新增 使用: 直接在方法上使用即可,如果要自定义前缀,...

  • mybatis自定义拦截器

    自定义注解 自定义拦截器 在MybatisPlusConfig中注册bean 使用注解 2.详细关于mybatis...

网友评论

    本文标题:自定义注解+拦截器优化项目代码

    本文链接:https://www.haomeiwen.com/subject/gjtqfctx.html