zoukankan      html  css  js  c++  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<HandlerMethodArgumentResolver> argumentResolvers) { // TODO Auto-generated method stub } @Override public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) { // TODO Auto-generated method stub } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // TODO Auto-generated method stub } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { // TODO Auto-generated method stub } @Override public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) { // TODO Auto-generated method stub } @Override public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> 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不需要登陆
    

      推荐阅读:https://blog.csdn.net/qq1404510094/article/details/80577555

  • 相关阅读:
    Linux文本处理
    鲜为人知的maven标签解说
    springboot整合websocket高级版
    springboot整合swagger。完爆前后端调试
    java的干儿子锁Lock
    AbstractQueuedSynchronizer(AQS)抽丝剥茧深入了解JUC框架原理
    【优雅写代码系统】springboot+mybatis+pagehelper+mybatisplus+druid教你如何优雅写代码
    居然还有人这样解说mybatis运行原理
    mybatis精讲(七)--动态sql
    基于redis实现分布式锁
  • 原文地址:https://www.cnblogs.com/mxh-java/p/11105401.html
Copyright © 2011-2022 走看看