springMVC添加注解@NeedLogin注解进行登录校验

springmvc项目添加@NeedLogin注解判断请求是否需要登录,所有添加注解的接口都需要登录后才能访问。

  添加@NeedLogin注解

/**
 * 是否需要登录
 * @author
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface NeedLogin {
    boolean value() default true;//是否需要登录 true 需要登录,false不需要登录
}

添加拦截器CheckLoginInterceptor

/** * 需要登录 * @author*/
public class CheckLoginInterceptor extends HandlerInterceptorAdapter {
    private static final Logger log = LoggerFactory.getLogger(CheckLoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod method = (HandlerMethod) handler;
            // 获取类和方法上的是否需要登录注解
            NeedLogin loginController = method.getClass().getAnnotation(NeedLogin.class);
            NeedLogin needLoginMehtod = method.getMethodAnnotation(NeedLogin.class);
            // 类和方法上都无需要登录注解
            if (!(loginController != null && loginController.value()) && !(needLoginMehtod != null && needLoginMehtod.value())){
                return true;
            }
            //该方法需要校验是否登录       //获取用户信息  
            UserInfo userInfo = 获取用户信息;
            if (userInfo != null) {
                return true;
            }
            log.info("未登录访问需要登录的请求 {}", request.getRequestURI());
            // 获取类和方法上的是否需要responseBody注解
            RestController restController = method.getBean().getClass().getAnnotation(RestController.class);
            ResponseBody ResponseBodyController = method.getBean().getClass().getAnnotation(ResponseBody.class);
            ResponseBody responseBodyMethod = method.getMethodAnnotation(ResponseBody.class);
            // 是否接口方法
            Boolean isApi = false;
            if(restController != null || responseBodyMethod != null || ResponseBodyController != null){
                isApi = true;
            }
            if (!isApi) {
                // 用户为空,重定向去登录
                // todo 跳转登录页return false;
            }
            // 请求接口,直接返回响应数据
            response.reset();
            //设置编码格式
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json;charset=UTF-8");
            PrintWriter pw = response.getWriter();
            pw.write(JSON.toJSONString(Result.error(ErrorCodeEnum.ERR_20003)));
            pw.flush();
            pw.close();
            return false;
        }
        return true;
    }
}

配置拦截器

<mvc:interceptor>
  <mvc:mapping path="/**"/>
  <bean class="com.common.interceptor.CheckLoginInterceptor"></bean>
</mvc:interceptor>