SpringBoot整合MybatisSQL过滤@Intercepts的实现

场景:

系统模块查询数据库需要根据用户的id去筛选数据。那么如果在 每个sql加user_id的过滤显然不明确。所以要在查询前将sql拼接上条件,做统一管理。

开发环境:

spring boot + mybatis

只需一个拦截类即可搞定(在看代码前需要了解注解@Intercepts()):

@Component
@Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }) })
public class SqlInterceptor implements Interceptor {

  private Logger logger = LoggerFactory.getLogger(SqlInterceptor.class);

  @Override
  public Object intercept(Invocation invocation) throws Throwable {
 logger.info("Interceptor......");
//    获取sql
 MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
 Object parameter = invocation.getArgs()[1];
 BoundSql boundSql = mappedStatement.getBoundSql(parameter);
 String oldsql = boundSql.getSql();
 logger.info("old:"+oldsql);

//    判断sql是否有where条件。改变sql。
 boolean status = oldsql.toLowerCase().contains("where");

 if (status) {
   BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), oldsql + " and 1=1",
       boundSql.getParameterMappings(), boundSql.getParameterObject());
   MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql));
   invocation.getArgs()[0] = newMs;
 }
// 继续执行
 Object result = invocation.proceed();
 return result;
  }

  @Override
  public Object plugin(Object target) {
 return Plugin.wrap(target, this);
  }

  @Override
  public void setProperties(Properties properties) {

  }

  // 复制原始MappedStatement
  private MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) {
 MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource,
     ms.getSqlCommandType());
 builder.resource(ms.getResource());
 builder.fetchSize(ms.getFetchSize());
 builder.statementType(ms.getStatementType());
 builder.keyGenerator(ms.getKeyGenerator());
 if (ms.getKeyProperties() != null) {
   for (String keyProperty : ms.getKeyProperties()) {
     builder.keyProperty(keyProperty);
   }
 }
 builder.timeout(ms.getTimeout());
 builder.parameterMap(ms.getParameterMap());
 builder.resultMaps(ms.getResultMaps());
 builder.cache(ms.getCache());
 builder.useCache(ms.isUseCache());
 return builder.build();
  }

  public static class BoundSqlSqlSource implements SqlSource {
 BoundSql boundSql;

 public BoundSqlSqlSource(BoundSql boundSql) {
   this.boundSql = boundSql;
 }

 public BoundSql getBoundSql(Object parameterObject) {
   return boundSql;
 }
  }

}

这样重启访问即可发现每次查询都会走这边!

到此这篇关于SpringBoot整合MybatisSQL过滤@Intercepts的实现的文章就介绍到这了,更多相关SpringBoot MybatisSQL过滤@Intercepts内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring boot设置过滤器、监听器及拦截器的方法

    前言 其实这篇文章算不上是springboot的东西,我们在spring普通项目中也是可以直接使用的 设置过滤器: 以前在普通项目中我们要在web.xml中进行filter的配置,但是只从servlet 3.0后,我们就可以在直接在项目中进行filter的设置,因为她提供了一个注解@WebFilter(在javax.servlet.annotation包下),使用这个注解我们就可以进行filter的设置了,同时也解决了我们使用springboot项目没有web.xml的尴尬,使用方法如下所示 @

  • Spring Boot拦截器和过滤器实例解析

    这篇文章主要介绍了Spring Boot拦截器和过滤器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想.在面向对象编程的过程中,我们很容易通过继承.多态来解决纵向扩展. 但是对于横向的功能,比如,在所

  • spring boot实现过滤器和拦截器demo

    整理文档,搜刮出一个spring boot实现过滤器和拦截器demo ,稍微整理精简一下做下分享. 拦截器定义: @WebServlet public class ActionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Ex

  • Spring Boot配置过滤器的2种方式示例

    前言 过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过滤器的两种方式. 一.@WebFilter注解方式 使用@WebFilter注解为声明当前类为filter,第一个参数为该filter起一个名字,第二个参数为说明要拦截的请求地址,当前类需要实现Filter接口,里面有三个方法,分别为过滤器初始化.过滤方法和过滤器销毁. @Slf4j @Web

  • spring boot 配置Filter过滤器的方法

    Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter 首先要准备一个实现了Filter的接口的类 SessionFilter: import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRespo

  • SpringBoot定义过滤器、监听器、拦截器的方法

    一.自定义过滤器 创建一个过滤器,实现javax.servlet.Filter接口,并重写其中的init.doFilter.destory方法. package com.example.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.Se

  • 详谈springboot过滤器和拦截器的实现及区别

    前言 springmvc中有两种很普遍的AOP实现: 1.过滤器(Filter) 2.拦截器(Interceptor) 本篇面对的是一些刚接触springboot的人群 所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别 (一些复杂的功能我会之后发出文章,请记得关注) Filter的简单实现 字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(reques

  • Spring Boot使用过滤器Filter过程解析

    这篇文章主要介绍了Spring Boot使用过滤器Filter过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先我们说说什么是过滤器,过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的,这个时候,也可以用到过滤器.过滤器的功能还有很多,例如实现URL级别的权限控制.压缩响应信息.编码格式等等. 过滤器依赖se

  • springboot登陆过滤功能的实现代码

    先简单说一下我们工程的架构:前端工程是采用react,后端工程采用spring-cloud,里面分为zuul工程和其他功能模块.zuul工程除了提供后端的路由转发,还可以做全局的过滤器,所以我选择在这个工程里面写登陆校验功能. session配置 这里使用redis存储session信息. 下载依赖,在pom.xml里面加入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g

  • SpringBoot实现过滤器、拦截器与切片的实现和区别

    Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是 Servlet 的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的 处理链 .Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应.使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filt

  • Spring Boot的filter(过滤器)简单使用实例详解

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public FilterRegistrationBean indexFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(new IndexFilter()); registration.addUrlPatterns("/&quo

随机推荐