全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

SpringBoot使用自定义注解实现权限拦截的示例

本文介绍了SpringBoot使用自定义注解实现权限拦截的示例,分享给大家,具体如下:

HandlerInterceptor(处理器拦截器)

常见使用场景

  • 日志记录: 记录请求信息的日志, 以便进行信息监控, 信息统计, 计算PV(page View)等
  • 性能监控:
  • 权限检查:
  • 通用行为:

使用自定义注解实现权限拦截

首先HandlerInterceptor了解

在HandlerInterceptor中有三个方法:

public interface HandlerInterceptor {

  // 在执行目标方法之前执行
  boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)throws Exception;

  // 执行目标方法之后执行
  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;

  // 在请求已经返回之后执行
  void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;

}

在以上注释中已经写明执行顺序, 测试及测试结果如下:

public class TestInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandler");
    return true;
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandler");
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("afterCompletion");
  }
}

结果:

preHandler
postHandler
afterCompletion

如何配置拦截器后面讲:

下面来讲讲这个拦截器是拦截的什么?

方法拦截器HandlerInterceptor

我们使用SpringMVC都知道SpringMVC是基于方法的请求处理, 和Struts2有明显区别(我是这么理解的), 并且Controller是单例模式, 所有请求都是从DispatcherServlet来调用请求url对应的方法的(处理器映射器的功能), 那么它是一个方法拦截器, 如何知道呢?

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  System.out.println(handler.getClass());
  return true;
}

执行结果:

class org.springframework.web.method.HandlerMethod

已经看到拦截器如何工作, 并且知道它是方法级别的拦截器, 那么接下来看看如何配置拦截器, 让它在服务器运行期间起作用

实现HandlerInterceptor

实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类
HandlerInterceptorAdapter适配器是对HandlerInterceptor接口做了默认实现, 这种适配器模式, 是为了方便开发者只去想要复写方法, 其他方法采取默认措施.

上面的TestInterceptor就是一个Demo, 具体可以按需求在我们想要拦截的位置进行相应的逻辑处理

配置拦截器

从Spring4.x开始, 就支持注解配置具体是使用@Configuration注解标注一个普通类, 使该类成为配置类, 可以在该类中定义Bean, 以及注入一些配置参数等.

首先, 我们要配置拦截器,就需要想SpringMvc的拦截链中取注入我们的拦截器, 这样才能请求进来时去拦截我们想要拦截的请求, 所以, 需要我们新建一个普通类, 使用@Configuration注解标注在类名上, 并且让该类继承WebMvcConfigurerAdapter,为什么不实现WebMvcConfigurer接口呢? 因为方法太多,我们不需要复写其中所有方法...

下面让我们新建一个配置类, 来配置我们的拦截器

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {

  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
  }
}

复写addInterceptors之后, 当我们的服务器启动时, 会自动调用这个方法, 参数怎么传我们都不用管(目前是java初级阶段, 没空研究Spring深层原理), 我们只要知道这个方法一定会被调用就行了.

我们直接new一个自定义拦截器, 注册到整个拦截链中, 并且制定拦截路径, 这样当满足请求url拦截配置时, 我们的自定义拦截器就会执行相应的方法了.

拦截方法是非常灵的, 除了拦截配置的, 也可以拦截非匹配的, 也可以根据正则表达式拦截请求

至此, 我们的拦截器就完成了, 接下来自定义权限相关注解

自定义权限注解

定义一个@interface类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Access {

  String[] value() default {};

  String[] authorities() default {};

  String[] roles() default {};

}

@Target注解是标注这个类它可以标注的位置:

常用的元素类型(ElementType):

public enum ElementType {
  /** Class, interface (including annotation type), or enum declaration */
  // TYPE类型可以声明在类上或枚举上或者是注解上
  TYPE,
  /** Field declaration (includes enum constants) */
  // FIELD声明在字段上
  FIELD,
  /** Method declaration */
  // 声明在方法上
  METHOD,
  /** Formal parameter declaration */
  // 声明在形参列表中
  PARAMETER,
  /** Constructor declaration */
  // 声明在构造方法上
  CONSTRUCTOR,
  /** Local variable declaration */
  // 声明在局部变量上
  LOCAL_VARIABLE,
  /** Annotation type declaration */
  ANNOTATION_TYPE,
  /** Package declaration */
  PACKAGE,
  /**
   * Type parameter declaration
   *
   * @since 1.8
   */
  TYPE_PARAMETER,
  /**
   * Use of a type
   *
   * @since 1.8
   */
  TYPE_USE
}

@Retention注解表示的是本注解(标注这个注解的注解保留时期)

public enum RetentionPolicy {
  /**
   * Annotations are to be discarded by the compiler.
   */
  // 源代码时期
  SOURCE,
  /**
   * Annotations are to be recorded in the class file by the compiler
   * but need not be retained by the VM at run time. This is the default
   * behavior.
   */
  // 字节码时期, 编译之后
  CLASS,
  /**
   * Annotations are to be recorded in the class file by the compiler and
   * retained by the VM at run time, so they may be read reflectively.
   *
   * @see java.lang.reflect.AnnotatedElement
   */
   // 运行时期, 也就是一直保留, 通常也都用这个
  RUNTIME
}

@Documented是否生成文档的标注, 也就是生成接口文档是, 是否生成注解文档

注解说完了, 下面需要到对应的controller的方法中取添加注解, 配置该方法允许的权限

在方法上配置权限

@RestController
public class HelloController {

  @RequestMapping(value = "/admin", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.GET)
  // 配置注解权限, 允许身份为admin, 或者说允许权限为admin的人访问
  @Access(authorities = {"admin"})
  public String hello() {
    return "Hello, admin";
  }
}

编写权限逻辑

// 自定义一个权限拦截器, 继承HandlerInterceptorAdapter类
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {

  // 在调用方法之前执行拦截
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 将handler强转为HandlerMethod, 前面已经证实这个handler就是HandlerMethod
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    // 从方法处理器中获取出要调用的方法
    Method method = handlerMethod.getMethod();
    // 获取出方法上的Access注解
    Access access = method.getAnnotation(Access.class);
    if (access == null) {
    // 如果注解为null, 说明不需要拦截, 直接放过
      return true;
    }
    if (access.authorities().length > 0) {
      // 如果权限配置不为空, 则取出配置值
      String[] authorities = access.authorities();
      Set<String> authSet = new HashSet<>();
      for (String authority : authorities) {
      // 将权限加入一个set集合中
        authSet.add(authority);
      }
      // 这里我为了方便是直接参数传入权限, 在实际操作中应该是从参数中获取用户Id
      // 到数据库权限表中查询用户拥有的权限集合, 与set集合中的权限进行对比完成权限校验
      String role = request.getParameter("role");
      if (StringUtils.isNotBlank(role)) {
        if (authSet.contains(role)) {
        // 校验通过返回true, 否则拦截请求
          return true;
        }
      }
    }
    // 拦截之后应该返回公共结果, 这里没做处理
    return false;
  }

}

至此, 我们启动服务器, 访问接口, 就能看到效果, 这里不做示范了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# SpringBoot  # 权限拦截  # spring  # boot  # 权限注解  # 实现权限拦截  # SpringBoot配置拦截器的示例  # SpringBoot之HandlerInterceptor拦截器的使用详解  # 解决Springboot @WebFilter拦截器未生效问题  # springboot拦截器过滤token  # 并返回结果及异常处理操作  # SpringBoot拦截器如何获取http请求参数  # SpringBoot拦截器实现登录拦截的方法示例  # SpringBoot基于自定义注解实现切面编程  # SpringBoot中自定义注解实现参数非空校验的示例  # java SpringBoot自定义注解  # 及自定义解析器实现对象自动注入操作  # SpringBoot 拦截器和自定义注解判断请求是否合法  # 拦截器  # 自定义  # 不需要  # 是从  # 它是  # 文档  # 一个普通  # 的人  # 的是  # 我是  # 就会  # 链中  # 太多  # 就能  # 让我们  # 中有  # 给大家  # 或者是  # 来看看  # 它可以 


相关文章: 如何做网站制作流程,*游戏网站怎么搭建?  如何高效搭建专业期货交易平台网站?  如何在局域网内绑定自建网站域名?  如何用AWS免费套餐快速搭建高效网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  用v-html解决Vue.js渲染中html标签不被解析的问题  成都响应式网站开发,dw怎么把手机适应页面变成网页?  做企业网站制作流程,企业网站制作基本流程有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  如何用已有域名快速搭建网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站之星代理费用多少?最新价格详情介绍  php json中文编码为null的解决办法  c++怎么用jemalloc c++替换默认内存分配器【性能】  宝塔建站教程:一键部署配置流程与SEO优化实战指南  ,巨量百应是干嘛的?  javascript中的try catch异常捕获机制用法分析  如何在云指建站中生成FTP站点?  官网网站制作腾讯审核要多久,联想路由器newifi官网  ,柠檬视频怎样兑换vip?  Swift开发中switch语句值绑定模式  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  Python lxml的etree和ElementTree有什么区别  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  建站之星微信建站一键生成小程序+多端营销系统  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  C#如何序列化对象为XML XmlSerializer用法  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何用花生壳三步快速搭建专属网站?  孙琪峥织梦建站教程如何优化数据库安全?  网页设计网站制作软件,microsoft office哪个可以创建网页?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  制作旅游网站html,怎样注册旅游网站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  建站之星如何配置系统实现高效建站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  网站制作免费,什么网站能看正片电影?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  广德云建站网站建设方案与建站流程优化指南  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何获取开源自助建站系统免费下载链接?  如何用好域名打造高点击率的自主建站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  h5网站制作工具有哪些,h5页面制作工具有哪些?  香港网站服务器数量如何影响SEO优化效果?  linux top下的 minerd 木马清除方法  韩国服务器如何优化跨境访问实现高效连接? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。