场景: 对需要校验  手机验证码和短信验证码的controller方法添加 自定义的注解 @CheckType

1. 定义注解

 /**
* 需要短信、验证码验证方法上的注解
* date: 2018年11月17日 上午10:28:50 <br/>
*
* @author ytqiao
*/
/**
*Retention注解:定义被它所注解的注解保留多久(
* SOURCE :被编译器忽略,
* CLASS : 注解将会被保留在Class文件中,但在运行时并不会被VM保留。这是默认行
* 为,所有没有用Retention注解的注解,都会采用这种策略。
* RUNTIME : 保留至运行时。所以我们可以通过反射去获取注解信息
* )
*Target注解:用于描述被该注解标注的注解的作用范围(即:被描述的注解可以用在什么
* 地方)
* 1. CONSTRUCTOR: 用于描述构造器
* 2. FIELD: 用于描述域
* 3. LOCAL_VARIABLE: 用于描述局部变量
* 4. METHOD: 用于描述方法
* 5. PACKAGE: 用于描述包
* 6. PARAMETER: 用于描述参数
* 7. TYPE: 用于描述类、接口(包括注解类型) 或enum声明
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface CheckType { /**
* 前置执行方法,定义在CheckTypeInterceptor中
* date: 2018年12月29日 下午5:41:19 <br/>
*
* @author zlliu
* @return
*/
String value() default ""; // 默认汉值
}

2: 配置系统参数(在application.yml中配置是否需要验证验证码)

......
info:
sys:
# 短信或验证码 0:短信 1:验证码,2:两个都验证,其它不验证
checkType: 2

3: 根据业务使用注解做出相应判断

  这里是在spring的aop中来判断注解,并决定是否进行验证码的校验

 /** HandlerInterceptor : spring 中要做拦截器所实现的代理接口。
* 要重写的三个方法为:
* 1. preHande: 在进入controller方法之前执行
* 2. postHandle: 在进入controller 方法之后,返回视图模型之前(也就是return语句
* 之前)执行
* 3. afterCompletion: 在controller 方法执行完之后执行。
*/ public class CheckTypeInterceptor implements HandlerInterceptor {
// @Value 注解是springBoot 用来获取系统配置的。 checkType配置在
// application.yml中,
@Value("${info.sys.checkType}")
private Integer checkType; // 系统中配置的是否需要验证验证码 // req、res参数就无需多解释
// handler 参数是被代理的方法对象(这里之所以说代理而不是说被拦截的,是因为
// spring的拦截器是基于aop而aop是用动态代理实现。也可以理解成是被拦截的方
// 法对象)
@Override
public boolean preHande(HttpServletRequest req, HttpServletResponse
res, Object handler) {
// 当获取到的系统中的配置为null,时,说明不校验。就放过
if (checkType == null) {
return true;
}
// 将被拦截的方法对象转成HandlerMethod对象
// 关于HandlerMethod对象,是用来封装方法定义相关的信息(如:方法所属
// 类、方法的参数、方法本身等)。可以理解成是具有了方法信息的一个实体
// 类.
// @CheckType 注解标记
HandlerMethod handlerMethod = (HandlerMethod)handler;
// 调用getMethod()方法来获取方法本身,一遍
Method method = handlerMethod.getMethod();
// 用方法本身来调用getAnnotation(x)方法来拿到参数中传入的注解类
// 如果返回值不为空说明方法被该注解标记。否则没有被该注解标记
CheckType checkType = method.getAnnotation(CheckType.class);
if (checkType == null) {
// 这里根据业务,如果没有加注解,说明不需要验证验证码,就返回
// true.
return true;
}
// 拿到传入注解中的值
Stirng value = checkType.value();
// 根据传入的值来做一些业务相关判断
// 下面就都与业务相关了。这里不贴出。 如果要拿到传入Controller 的参数
// 那么就调用req.getParameter("xxx");即可 } }

4. 将自定义的拦截器类注册到容器系统中

/**
* 我们在自定义拦截器的时候,仅仅定义一个类实现HandlerInterceptor接口是不够的
*我们还要将自定义的拦截器类注册到系统中并重写方法来告诉系统都需要拦截什么样的请*求
* 所以这里就是实现 WebMvcConfigurer 接口(此接口是spring boot中的)。
* WebMvcConfigurer 接口是springboot 定义配置的接口,相当于spring的.xml配置文*件
*代码如下:
*/
public class SmsConfiguration implements WebMvcConfigurer{
// @Bean注解是将该方法产生的bean交给spring容器管理
@Bean
public CheckTypeInterceptor checkTypeInterceptor() {
return new CheckTypeInterceptor();
} // addInterceptors 是来注册拦截器的方法(如果不使用
// springboot 估计要在配置文件中配置了)
@Override
public void addInterceptors(InterceptorRegistry registry) {
/** addInterceptor("xxx"); 方法是给注册具体的拦截器的, 参数格式为:
*自定义的注解的对象调用addPathPatterns("xxx")方
*法,来为自定义拦截器添加拦截的请求
* 另外一个方法 registry.addInterceptor(checkTypeInterceptor()).addPathPatterns("xxx").excludePathPatterns("xxx","xxx","xxx",...)
* 这里的excludePathPatterns():方法是用来排除特定的请求的,比如首页等。 所以一般的做法是:先用addInterceptor("/**")方法来添加拦截所有的请求,在用excludePathPatterns
* 来排除不需要拦截的请求即可
 registry.addInterceptor(checkTypeInterceptor()).addPathPatterns("/customer/**")
// 这样如果浏览器端的请求格式符合上述配置,那么就会被拦截到。 就会进入上面自定义拦截器类中的 preHande 方法
  } }

至此, 在springboot 中自定义拦截器就完成了。

纯手敲,仅供参考 。 可能方法名等有敲错的地方,望谅解。

版权所归: 转载请注明出处!

java 自定义注解,并使用示例的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  3. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  4. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  5. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

  6. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  7. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  8. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  9. JAVA自定义注解

    在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...

  10. Java 自定义注解

    在spring的应用中,经常使用注解进行开发,这样有利于加快开发的速度. 介绍一下自定义注解: 首先,自定义注解要新建一个@interface,这个是一个注解的接口,在此接口上有这样几个注解: @Do ...

随机推荐

  1. POJ1511 Invitation Cards —— 最短路spfa

    题目链接:http://poj.org/problem?id=1511 Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Tota ...

  2. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)

    最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得.后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的 ...

  4. cocos2d-x 坐标系解惑

    1.CCTouch* touch->getLocation() ---- 返回当前触摸点在openGL坐标系中的位置 openGL坐标系,原点在左下角,x向右为正,y向上为正. 2.CCTouc ...

  5. 使用CompletableFuture+ExecutorService+Logback的多线程测试

    1. 环境 Java: jdk1.8.0_144 2. 背景 Java多线程执行任务时,Logback输出的主线程和各个子线程的业务日志需要区分时,可以根据线程池和执行的线程来区分,但若要把它们联系起 ...

  6. MySQL暴错注入方法整理

    1.通过floor暴错 /*数据库版本*/ http://www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat( ...

  7. JAVA基础-面向对象07

    一.代码块 1. 含义: 就是使用大括号括起来的一段代码 格式 { 代码: } 2.静态代码块 格式 static{ 代码: } 书写位置: 直接书写在类中成员位置: 怎么执行呢? 在类加载的最后一步 ...

  8. 【废弃】JavaScript 控制类语法

    创建: 2017/10/07 完成: 2017/10/07 结束: 2019/02/19 把所有内容迁出到[JavaScript 基础]并将本博文归档到[废弃] return前加一个空格, 使所有单元 ...

  9. CoreBluetooth Central模式 Swift版

    也是醉了,CB这个API到现在也没有Swift的文档.最新的文档还是3年前还是4年前的OC版的,被雷的外焦里嫩的.自己一点一点写成Swift还各种报错,最坑的是这些错误压根找不到解决方案.索性自己做个 ...

  10. (水题)洛谷 - P1149 - 火柴棒等式

    https://www.luogu.org/problemnew/show/P1149 一开始还分类重复了.在非0的dfs中居然赋值了0,脑残得一笔. 其实就按 $lead0$ 分类就好了, $lea ...