背景

自定义注解标注受保护的资源访问,当要访问的url被标注了@LoginRequied的时候就变成了一个受保护的资源,需要用户登录或者更进一步需要用户拥有某个权限才能操作。本项目使用的springboot2.0

话不多说直接上代码。

实现过程

注解类:LoginRequired

//省略import

/**

* 拦截声明

*/

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface LoginRequired {

boolean value() default true;

}

现在有了我们想要使用的注解 下一步就是怎么去实现它,因为要对http请求进行拦截所以我们在这可以直接设置一个拦截器拦截所有的请求,当看到被拦截的请求有@LoginRequired注解的时候,我们再去判断是否符合条件。

下面我们来实现这个拦截器。

//省略import

/**

* 自定义的一个登录拦截器

*/

public class LoginInterceptor extends HandlerInterceptorAdapter {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

if (handler instanceof HandlerMethod) {

LoginRequired loginRequired = findAnnotation((HandlerMethod) handler, LoginRequired.class);

//没有声明需要权限,或者声明不验证权限

if (loginRequired == null) {

return true;

} else {

String token = request.getHeader(“token”);//得到token

if (StringUtils.isEmpty(token)) {

token = request.getParameter(“token”);

}

//在这里实现自己的权限验证逻辑

if (!StringUtils.isEmpty(token)) {//如果验证成功返回true(这里直接写false来模拟验证失败的处理)

return true;

} else {//如果验证失败

response.getWriter().write(new Result(HttpStatusConstant.REQUIRED_LOGIN).toJSONString());

return false;

}

}

} else {

return true;

}

}

private T findAnnotation(HandlerMethod handler, Class annotationType) {

T annotation = handler.getBeanType().getAnnotation(annotationType);

if (annotation != null) return annotation;

return handler.getMethodAnnotation(annotationType);

}

}

preHandle函数表示在之前处理,用到这里就是在访问发生之前触发,我们利用反射找到LoginRequired 然后进行处理。这样所有准备工作就做完了。但是我们想要在spring中使用它还需要告诉spring我写了一个拦截器。

所以我们再新建一个InterceptorConfig类:

//ignore import

@Configuration

public class InterceptorConfig extends WebMvcConfigurerAdapter {

@Bean

public LoginInterceptor loginInterceptor(){

return new LoginInterceptor();

}

/**

* 注册当前的interceptor

* @param registry

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(loginInterceptor());

}

}

大功告成。剩下的就是在你Controller中需要登录验证的请求的方法上面添加@LoginRequired注解了。

loginrequired注解_简单实现一个登录验证的注解来保护私有资源相关推荐

  1. laravel身份证验证_简单的Laravel登录身份验证

    laravel身份证验证 This article has been upgraded to work with Laravel 4.1.26 本文已升级为可与Laravel 4.1.26一起使用 T ...

  2. java编译时注解_简单介绍 Java 中的编译时注解

    1. 前言 上一篇 主要介绍了什么是 注解 (Annotation) 以及如何读取 运行时注解 中的数据, 同时用注解实现了简单的 ORM 功能. 这次介绍另一部分: 如何读取 编译时注解 ( Ret ...

  3. java spring 登录验证_浅析Spring Security登录验证流程源码

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...

  4. 怎么实现注解_通透!一口气搞懂注解到底怎么用

    日志脱敏场景简介 在日志里我们的日志一般打印的是 model 的 Json string,比如有以下 model 类 public class Request { /** * 用户姓名 */ priv ...

  5. 自定义JAVA注解_深入理解Java:自定义java注解

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  6. java nullable注解_【Java】idea @NotNull @Nullable 注解

    这两个注解在idea里面可以帮助我们检测方法的返回值,方法参数以及局部变量是否为空,从而帮助我们减少一些NPE的发生. 1. 原始注解 @NotNull @Nullable最开始只能使用idea提供的 ...

  7. pythonurllib登录微博账号_简单爬虫实现登录新浪微博(python2.7)

    因为图论作业,所以要写一个爬虫,就开始学python.接触python开始,就觉得这个语言非常舒服,不需要定义变量,不需要分号,非常简洁. 下面就聊聊,我写爬虫的经历.上网搜了一下爬虫的代码,发现简单 ...

  8. editor编辑器为什么头部信息会不见_简单聊一聊一个前端编辑器的性能优化

    最近项目一直在使用 Monaco Editor 这个库. 在我加了一个新功能之后, 整个编辑器开始变的非常卡, 我试图解决这个性能问题. 但是发现有一些棘手... 评论以及文末有更新 场景 其实我加的 ...

  9. springmvc常用5种注解_简单有气势的排比句,常用的5种句式你会吗?

    排比句是把三个或以上意义相关或相近.结构相同或相似.语气相同的词组或句子放在一起,有的同学特别喜欢用排比句,因为它排列整齐,读起来很有气势,在文章中特别亮眼. 写好排比句,重点是要先确定基本句式,然后 ...

最新文章

  1. 伯克利提出AdaSearch:一种用于自适应搜索的逐步消除方法
  2. 编程语言也有环保排队?垫底的居然是它...
  3. Windows7 WIN 7 64位 环境编译6sv2.1版本的大气传输模型
  4. 摩拜单车又涨价了!真的要骑不起了
  5. python实现给定信号生成任意信噪比的带噪声信号
  6. C++ 从入门到入土(English Version) Section 2:Computer Memory and Number Systems
  7. GB28181学习之路——eXosip获取IP和端口
  8. 运用ssis组件实现邮件发送,内容来源于数据库表
  9. Firefox恢复书签
  10. 汇编移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR
  11. docker 安装完成后测试hello-world出现问题(Unable to find image 'hello-world:latest' locally)
  12. PHP智云全能API接口源码V1.3
  13. java连接高斯数据库,高斯数据库 (gaussDB) - 基于 JDBC 开发 (9)
  14. html论文参考文献m,论文与排版
  15. 踩坑sunbeam rbt 去除host reads
  16. 德州仪器公司(TI)发布2018年第二季度财务业绩与股东回报
  17. 软件开发:最佳实践 != 过度设计
  18. java使用easypoi导出为word文档
  19. 软件定义汽车 新一代技术发展
  20. Python+Vue计算机毕业设计教务排课系统q2tm2(源码+程序+LW+部署)

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院挂号系统
  2. 基于JAVA+SpringMVC+MYSQL的在线招标管理系统
  3. Django-安装/分组命名/路由分发
  4. 永遠のゼロ       012
  5. 1. 概述--从零起步实现基于Html5的WEB设计器Jquery插件
  6. 【论文阅读-Bidding】《Real-Time Bidding Algorithms for Performance-Based Display Ad Allocation,2011年,微软》...
  7. python-实现栈结构
  8. 一种牛逼的网站分享插件实现
  9. 敏捷图书排行 (2011年修订)【转】
  10. 如何不用MDI方式在Form1上显示Form2