java注解验证_Java注解(Annotation )--结合拦截器实现是否登录验证

什么是注解?

Annotation 中文译过来就是注解、标释的意思。现在的技术文档都是在用专业名词来介绍专业名词,理解起来晦涩难懂,我个人认为注解就是用来解释代码的。比如@Override注解,就是告诉Java虚拟机我继承或实现的父类的方法被我重写了,调用父类该方法时调用我重写的这个方法。

什么是元注解?

元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。

如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。

元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。

@Retention

Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。

它的取值如下:

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。

RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。

RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

@Documented

顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。

@Target

Target 是目标的意思,@Target 指定了注解运用的地方。

@Target 有下面的取值:

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解

ElementType.CONSTRUCTOR 可以给构造方法进行注解

ElementType.FIELD 可以给属性进行注解

ElementType.LOCAL_VARIABLE 可以给局部变量进行注解

ElementType.METHOD 可以给方法进行注解

ElementType.PACKAGE 可以给一个包进行注解

ElementType.PARAMETER 可以给一个方法内的参数进行注解

ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Inherited

Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

说的比较抽象。代码来解释。

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@interface Test {}

@Test

public class A {}

public class B extends A {}

注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

具体代码如下:

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 标注此注解的controller不需要登陆

* @author 尘世间迷茫的小书童

*

*/

@Documented //该注解表示 是否被JavaDoc处理并保留在文档中

@Target({ElementType.METHOD, ElementType.TYPE}) //注解使用的地方

@Retention(RetentionPolicy.RUNTIME) //源码保留级别

public @interface NoLogin {

}

CheckLoginInterceptor:

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class CheckLoginInterceptor implements HandlerInterceptor {

private static final Logger logger = Logger.getLogger(CheckLoginInterceptor.class);

@Override

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

throws Exception {

// TODO Auto-generated method stub

if(!(handler instanceof HandlerMethod)) {

logger.warn("当前操作handler不为HandlerMethod=" + handler.getClass().getName() + ",req=" + request.getQueryString());

return true;

}

HandlerMethod handlerMethod = (HandlerMethod) handler;

String methodName = handlerMethod.getMethod().getName();

NoLogin noLogin = handlerMethod.getMethod().getAnnotation(NoLogin.class);

if(null != noLogin) {

logger.info("当前访问methodName=" + methodName + "不需要登陆");

System.out.println("当前访问methodName=" + methodName + "不需要登陆");

return true;

}

noLogin = handlerMethod.getMethod().getDeclaringClass().getAnnotation(NoLogin.class);

if(null != noLogin) {

logger.info("当前访问methodName= " + methodName + " 不需要登陆");

System.out.println("当前访问methodName= " + methodName + " 不需要登陆");

return true;

}

//验证请求中是否包含session

if(null == request.getSession()) {

logger.info("当前访问 methodName=" + methodName + "用户未登录,IP= " + request.getRemoteAddr());

System.out.println("当前访问 methodName=" + methodName + "用户未登录,IP= " + request.getRemoteAddr());

return false;

}

logger.info("当前访问methodName=" + methodName + "需要登陆");

System.out.println("当前访问methodName=" + methodName + "需要登陆");

return false;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

// TODO Auto-generated method stub

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

// TODO Auto-generated method stub

}

}

InterceptorConfig:

import java.util.List;

import org.springframework.context.annotation.Configuration;

import org.springframework.format.FormatterRegistry;

import org.springframework.http.converter.HttpMessageConverter;

import org.springframework.validation.MessageCodesResolver;

import org.springframework.validation.Validator;

import org.springframework.web.method.support.HandlerMethodArgumentResolver;

import org.springframework.web.method.support.HandlerMethodReturnValueHandler;

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;

import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;

import org.springframework.web.servlet.config.annotation.CorsRegistry;

import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;

import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//也可以继承WebMvcConfigurerAdapter类只重写addInterceptors方法,下面代码比较啰嗦

@Configuration

public class InterceptorConfig implements WebMvcConfigurer {

@Override

public void configurePathMatch(PathMatchConfigurer configurer) {

// TODO Auto-generated method stub

}

@Override

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

// TODO Auto-generated method stub

}

@Override

public void configureAsyncSupport(AsyncSupportConfigurer configurer) {

// TODO Auto-generated method stub

}

@Override

public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

// TODO Auto-generated method stub

}

@Override

public void addFormatters(FormatterRegistry registry) {

// TODO Auto-generated method stub

}

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new CheckLoginInterceptor()).addPathPatterns("/**");

}

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

// TODO Auto-generated method stub

}

@Override

public void addCorsMappings(CorsRegistry registry) {

// TODO Auto-generated method stub

}

@Override

public void addViewControllers(ViewControllerRegistry registry) {

// TODO Auto-generated method stub

}

@Override

public void configureViewResolvers(ViewResolverRegistry registry) {

// TODO Auto-generated method stub

}

@Override

public void addArgumentResolvers(List argumentResolvers) {

// TODO Auto-generated method stub

}

@Override

public void addReturnValueHandlers(List returnValueHandlers) {

// TODO Auto-generated method stub

}

@Override

public void configureMessageConverters(List> converters) {

// TODO Auto-generated method stub

}

@Override

public void extendMessageConverters(List> converters) {

// TODO Auto-generated method stub

}

@Override

public void configureHandlerExceptionResolvers(List exceptionResolvers) {

// TODO Auto-generated method stub

}

@Override

public void extendHandlerExceptionResolvers(List exceptionResolvers) {

// TODO Auto-generated method stub

}

@Override

public Validator getValidator() {

// TODO Auto-generated method stub

return null;

}

@Override

public MessageCodesResolver getMessageCodesResolver() {

// TODO Auto-generated method stub

return null;

}

}

TestController:

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class TestController {

@NoLogin

@GetMapping("/user/login.htm")

@ResponseBody

public void login(String username, String password) {

}

@ResponseBody

@GetMapping("/user/userInfo.htm")

public void getUserInfo(Long userId) {

}

@NoLogin

@ResponseBody

@GetMapping("/user/register.htm")

public void register(String username, String password) {

}

}

运行效果:

2019-06-29 00:17:41.222 INFO 11388 --- [nio-8001-exec-1] www.mxh.com.CheckLoginInterceptor : 当前访问methodName=getUserInfo需要登陆

当前访问methodName=getUserInfo需要登陆

2019-06-29 00:17:57.987 INFO 11388 --- [nio-8001-exec-4] www.mxh.com.CheckLoginInterceptor : 当前访问methodName=login不需要登陆

当前访问methodName=login不需要登陆

2019-06-29 00:27:37.214 INFO 11388 --- [nio-8001-exec-9] www.mxh.com.CheckLoginInterceptor : 当前访问methodName=register不需要登陆

当前访问methodName=register不需要登陆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值