SpringMVC自定义注解验证登陆拦截

简介: 这里业务场景需要,所有的请求都需要登录验证。个别通用业务不需要登录拦截。注解方式替代原有的if判断。

这里业务场景需要,所有的请求都需要登录验证。个别通用业务不需要登录拦截。注解方式替代原有的if判断。

使用:@RequireLogin默认(required = true)进行登录拦截。 声明属性required = false则放行。方法注解标记的优先级将大于类注解标记。

元注解说明:

@Retention:注解的保留位置         
@Retention(RetentionPolicy.SOURCE)    //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)     //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)   //注解会在class字节码文件中存在,在运行时可以通过反射获取到
       
@Target:注解的作用目标
@Target(ElementType.TYPE)   //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR)  //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包   
@Document:说明该注解将被包含在javadoc中
             
@Inherited:说明子类可以继承父类中的该注解

image.gif

1、自定义注解@RequireLogin:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 提供登陆拦截注解,默认全局登陆拦截,如果标记required = false则不拦截
 * @author asus
 * @date 2019/8/6
 */
@Target({ ElementType.METHOD, ElementType.TYPE }) //方法和类
@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到
public @interface RequireLogin {
    boolean required() default true;
}

image.gif

2、定义登陆拦截器:

/**
 * Created by asus on 2019/8/6.
 */
@Component
public class LoginInterceptor extends BaseInterceptor {
    private static Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("进入登陆拦截器...");
        if(isFilter(request, response, (HandlerMethod) handler)){
            return super.preHandle(request, response, handler);
        }
        try {
            if(isLoginCheck){   //这里进行用户身份信息验证
                ResponseUtils.renderText((HttpServletResponse) response, Response.fail("登陆信息失效,请重新登陆获取", ErrorCode.NEED_LOGIN).toString());
                return false;
            }
        } catch (Exception e) {
            logger.error("处理异常" + e.getMessage(), e);
            ResponseUtils.renderText((HttpServletResponse) response,Response.fail("处理失败", ErrorCode.PROCESS_ERROR).toString());
        }
        return super.preHandle(request, response, handler);
    }
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
}

image.gif

3、继承的BaseInterceptor:

import com.yllt.common.annotation.RequireLogin;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Created by asus on 2019/8/6.
 */
public class BaseInterceptor extends HandlerInterceptorAdapter {
    public boolean isFilter(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler) {
        // 判断当前method上是否有标签;
        HandlerMethod hm = (HandlerMethod) handler;
        //类上有该标记
        RequireLogin classAnnotation = hm.getBeanType().getAnnotation(RequireLogin.class);
        //方法上有该标记
        RequireLogin methodAnnotation = hm.getMethod().getAnnotation(RequireLogin.class);
        //方法上的注解优先
        RequireLogin requireLogin = methodAnnotation != null ? methodAnnotation : classAnnotation;
        if (requireLogin != null && !requireLogin.required()) {
            // 如果标记required = false 则放行
            return true;
        }
        return false;
    }
}

image.gif

4、测试demo:

@Controller
@RequestMapping("app")
@RequireLogin(required = false)
public class LoginAction extends BaseAction{
  @ResponseBody
  @RequestMapping(value="login")
  public Response<?> login(String userName, String password){
        return Response.success("111");
  }
    @RequireLogin
    @RequestMapping("index")
    @ResponseBody
    public Response<?> index(){
      return Response.success("222");
    }
}

image.gif

这里类使用了注解@RequireLogin(required = false),则访问app/login.jhtml不拦截。

方法index由于使用了方法注解标记,优先级大于类注解标记,这里访问app/index.jhtml进行拦截。

相关文章
|
前端开发 Java 编译器
SpringMVC自定义注解---[详细介绍]
SpringMVC自定义注解---[详细介绍]
47 0
|
24天前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
37 4
|
23天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
70 2
|
24天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
40 2
|
24天前
|
前端开发 Java 开发者
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
58 0
|
3月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
266 1
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
该博客文章详细介绍了SpringMVC中`@RequestMapping`注解的使用方法,包括其功能、位置、value属性、method属性、params属性、headers属性以及支持的路径风格和占位符,并通过实际代码案例展示了如何建立请求与控制器方法之间的映射关系。
SpringMVC入门到实战------3、@RequestMapping注解(超详细基础知识+实际代码案例)
|
7月前
|
前端开发 Java Spring
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
170 1
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
|
7月前
|
XML 前端开发 Java
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
75 1
|
7月前
|
缓存 安全 Java
SpringMVC自定义注解和使用
SpringMVC自定义注解和使用
147 0