java注解从JDK5开始,Java增加了注解的新功能。注解实际上是代码中的特殊标记。这些标签可以在编译、类加载和运行时被读取,不改变代码原有的逻辑,将注解信息嵌入到源文件中。然后通过返回获取注解信息,根据不同的注解信息进行不同的逻辑处理。其中,Java有如下元注解:@Retention@Retention修改注解可以保留多长时间,只包含一个RetentionPolicy成员变量。RetentionPolicy.CLASS的默认值,编译器在class文件中记录Annotation。运行Java程序时,JVM获取不到Annotation信息。RetentionPolicy.RUNTIME编译器在类文件中记录Annotation。JVM在运行Java程序时,可以获得Annotation信息,可以通过反射获取Annotation信息。自定义注释更频繁地使用此变量。RetentionPolicy.SOURCEAnnotation只保留在源代码(即Java文件)中,编译器直接丢弃Annotation。@Target@Target修改一个Annotation定义,表示Annotation可以修改的地方:ElementType.TYPE类、接口和枚举ElementType.FIELD成员变量ElementType.METHOD方法ElementType.PARAMETER封装定义ElementType.CONSTRUCTOR构造函数ElementType.ANNOTATION_TYPEAnnotationElementType.PARAMETER参数登录注解@Logined注解需求以电商系统为例,请求后台接口分为登录后访问和未登录访问两类,所以需要根据不同的需求做不同的处理,不登录required访问的接口不需要处理,需要登录的接口每次请求时都需要验证请求。在Spring中可以使用拦截器来验证登录信息,是否需要登录验证,这个需要使用注解。首先创建一个注解@Logined,它要实现的功能:在需要登录访问的接口上加上这个注解,可以在类和方法上加上,如果在类上加上,则所有请求类下的方法需要进行登录验证。添加到方法中,只需要对该方法进行身份验证。@Logined注解定义如下:@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceLogined{/***是否需要登录才能访问**@return*/booleanisLogined()defaulttrue;}其中@Target设置ElementType.METHOD和ElementType.TYPE表示可以在类和方法上修改注解,@Retention设置RetentionPolicy.RUNTIME,需要JVM来在运行时获取注解信息。isLogined是注解的成员变量,后面会讲到。首先定义一个Controller控制器:@RestController@LoginedpublicclassTestController{@GetMapping("/login")publicStringlogin(){return"needlogin";}}获取拦截器上的@Logined注解,每次发送一个http请求后,都会进入拦截器。publicclassMyInterceptorextendsHandlerInterceptorAdapter{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{if(!(handlerinstanceofHandlerMethod)){返回真;}HandlerMethodhandlerMethod=(HandlerMethod)处理程序;方法method=handlerMethod.getMethod();booleanisLogin=this.isLogin(方法);如果(!isLogin){返回真;}//这里对登录信息进行验证,比如token验证,cookie验证returntrue;}privatebooleanisLogin(Methodmethod){//获取方法头值LoginedclassLogined=method.getDeclaringClass().getAnnotation(Logined.class);登录方法Logined=method.getAnnotation(Logined.class);//如果方法上有注解,则返回isLoginedif(classLogined!=null&&methodLogined==null){System.out.println(classLogined.isLogined());返回rnclassLogined.isLogined();}//方法上没有注解,再找类上的注解if((classLogined!=null&&methodLogined!=null)||(classLogined==null&&methodLogined!=null)){已登录();}返回假;}}拦截器流程:获取请求类对应的方法通过反射找到方法上的@Logined注解,类上有@Logined注解如果类上有@Logined注解,类上没有@Logined方法注解,返回类@Logined注解的isLogined。如果类和方法有@Logined注解或者类没有@Logined方法注解,返回方法的isLogined在上面判断。如果返回为false,则不会进行后续的登录信息验证,否则需要进行登录信息验证登录信息验证可以是token验证,cookie验证。综上所述,在需要请求的接口类或方法上加上@Logined,表示请求的接口需要登录后才能访问。如果您不需要它,请不要添加它。如果添加了类并且无需登录就可以访问方法,只需添加@Logined(isLogined=false)。获取拦截器中类或方法的注解。如果有注解,则需要登录验证。没有的话直接pass。如果您觉得文章对您有帮助,请点个赞吧!