SpringMVC拦截器中的preHandle方法的传入参数handler可以用于获取当前执行方法的相关信息,例如方法,参数,返回值,注解等。

在方法上使用注解传入权限码,然后通过request拿到登录标识,用登录标识,请求链接验证当前用户是否拥有所访问方法所需的权限码,从而拦截或不拦截,达到权限控制的目的。

以下为示例,注释已经比较清楚了

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    Authorization annotation = null;
    try {
        String username = null; // TODO 获取用户名
        if (StringUtils.isBlank(username)) {
            return false; // 拿不到登录名,未登录,没有权限
        }
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(Authorization.class);
            if (annotation != null) {

                String code = annotation.value();
                if (StringUtils.isBlank(code)) {
                    // 没有设置权限码,放行
                    return true;
                }

                boolean hasPermission = false;// TODO 通过url,用户名,ip,注解的权限码等 验证当前用户是否有权限访问
                if (hasPermission) {
                    return true;
                }

                // TODO 错误输出、重定向
                return false;
            }
            // 没有注解,放行
            return true;
        } else {
            // TODO 不清楚handler类型不是HandlerMethod的情况,暂返回false
            return false;
        }
    } catch (Exception e) {
        logger.error("权限拦截异常", e);
    }
    return false;
}