900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Spring boot 自定义拦截器 获取 自定义注解 信息

Spring boot 自定义拦截器 获取 自定义注解 信息

时间:2024-06-10 18:26:26

相关推荐

Spring boot 自定义拦截器 获取 自定义注解 信息

目录

自定义注解

自定义拦截器

接口访问测试

1、项目中某些需求可以使用自定义注解,然后在 Spring boot 拦截器 HandlerInterceptor 中获取自定义注解的信息。

2、本文环境:Spring boot 2.3.5.RELEASE + Java jdk 1.8.

自定义注解

1、其实只要参考一下其它注解就能写出自己需要的注解,其中几个重要注解如下:

2、@Target: 表示注解使用的目标位置, 常用的有:

TYPE:类,接口,注解,枚举

FIELD:成员变量

METHOD:方法

PARAMETER:形式参数

CONSTRUCTOR:构造器

3、@Retention: 表示注解生命范围, 类似 maven pom.xml 文件的 scope 属性, 可选值有:

SOURCE:编译器将丢弃注解

CLASS:注解将由编译器记录在类文件中,但不需要在运行时由VM保留,这是默认行为

RUNTIME:注解将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射地读取它们

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** 1: @Target: 表示注解使用的目标位置, 常用的有:* * TYPE(类,接口,注解,枚举), FIELD(成员变量), METHOD(方法), PARAMETER(形式参数), CONSTRUCTOR(构造器)* 2: @Retention: 表示注解生命范围, 类似 maven pom.xml 文件的 scope 属性, 可选值有:* * SOURCE(编译器将丢弃注解)* * CLASS(注解将由编译器记录在类文件中,但不需要在运行时由VM保留,这是默认行为),* * RUNTIME(注解将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射地读取它们)** @author wangMaoXiong* @version 1.0* @date /8/25 23:13*/@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MultipleOperate {/*** 自定义属性值** @return*/String[] value() default {};/*** 描述** @return*/String desc() default "";}

在线演示源码:

/wangmx1993/java-se/java/org/example/annotation/ClassOperate.java

/wangmx1993/java-sejava/org/example/annotation/MethodOperate.java

/wangmx1993/java-se/java/org/example/annotation/MultipleOperate.java

自定义拦截器

import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Arrays;/*** 自定义拦截器** @author wangMaoXiong* @version 1.0* @date /8/24 20:23*/public class AppInterceptor implements HandlerInterceptor {/*** 请求进入时进行拦截,返回 true 时,表示继续往下走;* 返回 false 时, 表示停止后续的执行,即请求不会到达控制层.** @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {StringBuffer requestURL = request.getRequestURL();System.out.println("进入拦截器,用户请求:" + requestURL);if (handler instanceof HandlerMethod) {//方法处理器, 请求的目标方法HandlerMethod handlerMethod = (HandlerMethod) handler;//1: 获取目标方法上的指定注解,不存在时,返回 Null.MethodOperate methodOperate = handlerMethod.getMethodAnnotation(MethodOperate.class);if (methodOperate != null) {String desc = methodOperate.desc();System.out.println("\t目标方法存在 @MethodOperate 注解, desc=" + desc);}//2: 获取目标方法所在类上的指定主键, 不存在时, 返回 null.ClassOperate classOperate = handlerMethod.getMethod().getDeclaringClass().getAnnotation(ClassOperate.class);if (classOperate != null) {String[] value = classOperate.value();String desc = classOperate.desc();String vs = value != null ? Arrays.asList(value).toString() : "";System.out.println("\t目标方法所在的类存在 @ClassOperate 注解, desc=" + desc + ", value=" + vs);}// 3、获取目标方法及其类上的注解MultipleOperate multipleOperate1 = handlerMethod.getMethodAnnotation(MultipleOperate.class);MultipleOperate multipleOperate2 = handlerMethod.getMethod().getDeclaringClass().getAnnotation(MultipleOperate.class);if (multipleOperate1 != null) {String desc = multipleOperate1.desc();String[] value = multipleOperate1.value();String vs = value != null ? Arrays.asList(value).toString() : "";System.out.println("\t目标方法存在 @MultipleOperate 注解, desc=" + desc + ", value=" + vs);}if (multipleOperate2 != null) {String desc = multipleOperate2.desc();String[] value = multipleOperate2.value();String vs = value != null ? Arrays.asList(value).toString() : "";System.out.println("\t目标方法所在的类存在 @MultipleOperate 注解, desc=" + desc + ", value=" + vs);}}return true;}}

注册拦截器

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 应用配置** @author wangMaoXiong* @version 1.0* @date /8/25 9:13*/@Configurationpublic class AppConfig implements WebMvcConfigurer {/*** 注册拦截器* .addPathPatterns("/**"):表示拦截整个应用中的所有请求* .excludePathPatterns(String... patterns):表示排除这些规则的请求,不对它们进行拦截* <p>* spring Boot 2 以后,静态资源也会被拦截.* classpath:/META‐INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/"下的资源也会被拦截* 通常静态资源可以不需要进行拦截,可以对它们直接进行放行** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AppInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/index").excludePathPatterns("/webjars/**", "/css/**/*.css", "/js/**/*.js", "/fonts/**", "/images/**");}}

在线演示源码:

/wangmx1993/java-se/java/org/example/annotation/AppInterceptor.java

/wangmx1993/java-se/java/org/example/annotation/AppConfig.java

接口访问测试

import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.Map;/*** 控制层接口** @author wangMaoXiong* @version 1.0* @date /8/25 9:24*/@RestController@ClassOperate(desc = "AppController控制层", value = {"A1", "B2"})@MultipleOperate(value = {"x11", "x22", "x33"}, desc = "AppController")@SuppressWarnings("all")public class AppController {/*** http://localhost:8080/annotation/method1** @return*/@GetMapping("/annotation/method1")@MethodOperate(desc = "查询方法.")public Map<String, Object> method1() {Map<String, Object> dataMap = new HashMap<>();dataMap.put("code", 200);dataMap.put("msg", "success");dataMap.put("data", "method1");return dataMap;}/*** http://localhost:8080/annotation/method2** @return*/@GetMapping("/annotation/method2")public Map<String, Object> method2() {Map<String, Object> dataMap = new HashMap<>();dataMap.put("code", 200);dataMap.put("msg", "success");dataMap.put("data", "method1");return dataMap;}/*** http://localhost:8080/annotation/method3** @return*/@GetMapping("/annotation/method3")@MultipleOperate(value = {"x1", "x2", "x3"}, desc = "method3")public Map<String, Object> method3() {Map<String, Object> dataMap = new HashMap<>();dataMap.put("code", 200);dataMap.put("msg", "success");dataMap.put("data", "method1");return dataMap;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。