package com.example.mybatis_plus_demo.config;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.mybatis_plus_demo.annotations.AuthMapper;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.Properties;
/**
* @author :dzp
* @date :Created in 2021/8/12 17:18
* @description:拦截select请求 并判断是否是自定义注解 如果是的话 就进行权限sql的修改。
* 1.Executor:拦截执行器的方法。
* 2.ParameterHandler:拦截参数的处理。
* 3.ResultHandler:拦截结果集的处理。
* 4.StatementHandler:拦截Sql语法构建的处理。
*
* 该拦截器的作用是拦截执行的sql 进行更改 加入关联对应的通道信息权限的sql。
*
*/
@Component
@Intercepts({
@Signature(
type= Executor.class,
method = "query",
args = {MappedStatement.class,Object.class
, RowBounds.class, ResultHandler.class,
CacheKey.class, BoundSql.class})})
public class SqlReplaceInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
return getSqlByInvocation(invocation);
}
/**
* 获取sql语句
* @param invocation
* @return
*/
private Object getSqlByInvocation(Invocation invocation) throws InvocationTargetException, IllegalAccessException, ClassNotFoundException {
final Object[] args = invocation.getArgs();
MappedStatement ms = (MappedStatement) args[0];
SqlCommandType sqlCommandType = ms.getSqlCommandType();
Object parameterObject = args[1];
BoundSql boundSql = ms.getBoundSql(parameterObject);
String sql = boundSql.getSql();
if (StringUtils.isBlank(sql)) {
return invocation.proceed();
}
try {
//todo 这里可以获取到用户id的信息 进行切面
resetSql2Invocation(invocation, boundSql.getSql() , 1);
}catch (Exception e) {
// 没有获取到用户消息
}
return invocation.proceed();
}
/**
* 包装sql后,重置到invocation中
* @param invocation
* @param sql
* @throws SQLException
*/
private void resetSql2Invocation(Invocation invocation, String sql,Integer id) throws ClassNotFoundException {
final Object[] args = invocation.getArgs();
MappedStatement statement = (MappedStatement) args[0];
Object parameterObject = args[1];
BoundSql boundSql = statement.getBoundSql(parameterObject);
Class<?> classType = Class.forName(statement.getId().substring(0, statement.getId().lastIndexOf(".")));
String mName = statement.getId().substring(statement.getId().lastIndexOf(".") + 1);
for (Method method : classType.getDeclaredMethods()) {
//判断是否包含AuthMapper注解(自定义的注解)
if (method.isAnnotationPresent(AuthMapper.class) && mName.equals(method.getName())) {
MappedStatement newStatement = newMappedStatement(statement, new BoundSqlSqlSource(boundSql));
//MeatObject是Mybatis的工具类,通过MetaObject获取和设置对象的属性值
MetaObject msObject = MetaObject.forObject(newStatement, new DefaultObjectFactory(), new DefaultObjectWrapperFactory(),new DefaultReflectorFactory());
Select select;
try {
select = (Select) CCJSqlParserUtil.parse(sql);
SelectBody selectBody = select.getSelectBody();
if(selectBody instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) selectBody;
//获取之前的条件
Expression oldWhere = plainSelect.getWhere();
Expression where=CCJSqlParserUtil.parseCondExpression( String.format(CustomConstantSql.SQL_AUTH, id));
if(oldWhere != null) {
where = CCJSqlParserUtil.parseCondExpression(oldWhere.toString() + " and " + String.format(CustomConstantSql.SQL_AUTH, id));
}
//重新设置where 条件
plainSelect.setWhere(where);
msObject.setValue("sqlSource.boundSql.sql", select.toString());
}
} catch (JSQLParserException e) {
// 如果上述出现异常 就用原来的sql
msObject.setValue("sqlSource.boundSql.sql", sql);
}
args[0] = newStatement;
// 这里需要注意 [0]变了还是执行原来的sql 需要这个 更改args[5]的
args[5]=newStatement.getBoundSql(parameterObject);
break;
}
}
}
/**
* 创建一个新的MappedStatement
* newMappedStatement
* @param ms
* @param newSqlSource
* @return
*/
private MappedStatement newMappedStatement(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 && ms.getKeyProperties().length != 0) {
StringBuilder keyProperties = new StringBuilder();
for (String keyProperty : ms.getKeyProperties()) {
keyProperties.append(keyProperty).append(",");
}
keyProperties.delete(keyProperties.length() - 1, keyProperties.length());
builder.keyProperty(keyProperties.toString());
}
builder.timeout(ms.getTimeout());
builder.parameterMap(ms.getParameterMap());
builder.resultMaps(ms.getResultMaps());
builder.resultSetType(ms.getResultSetType());
builder.cache(ms.getCache());
builder.flushCacheRequired(ms.isFlushCacheRequired());
builder.useCache(ms.isUseCache());
return builder.build();
}
class BoundSqlSqlSource implements SqlSource {
private BoundSql boundSql;
public BoundSqlSqlSource(BoundSql boundSql) {
this.boundSql = boundSql;
}
@Override
public BoundSql getBoundSql(Object parameterObject) {
return boundSql;
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(targ
没有合适的资源?快使用搜索试试~ 我知道了~
自定义注解实现拦截sql.rar
共116个文件
xml:82个
java:12个
class:12个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
1 下载量 45 浏览量
2021-10-08
21:45:18
上传
评论
收藏 113KB RAR 举报
温馨提示
自定义注解实现拦截sql,并在sql中增加相应的条件 。 对应博客: https://blog.csdn.net/qq_37716298/article/details/120659139
资源推荐
资源详情
资源评论
收起资源包目录
自定义注解实现拦截sql.rar (116个子文件)
SqlReplaceInterceptor.class 10KB
Users.class 3KB
MybatisPlusConfig.class 1KB
UsersServiceImpl.class 1KB
UsersController.class 1KB
SqlReplaceInterceptor$BoundSqlSqlSource.class 1KB
MybatisPlusDemoApplication.class 904B
UsersMapper.class 728B
IUsersService.class 644B
MybatisPlusDemoApplicationTests.class 590B
AuthMapper.class 454B
CustomConstantSql.class 234B
mvnw.cmd 6KB
.gitignore 395B
mybatis_plus_demo.iml 9KB
maven-wrapper.jar 50KB
SqlReplaceInterceptor.java 8KB
MavenWrapperDownloader.java 5KB
MybatisPlusConfig.java 787B
UsersServiceImpl.java 750B
UsersController.java 665B
UsersMapper.java 654B
MybatisPlusDemoApplication.java 470B
IUsersService.java 454B
Users.java 440B
AuthMapper.java 413B
MybatisPlusDemoApplicationTests.java 239B
CustomConstantSql.java 224B
demo.log 167KB
HELP.md 891B
mvnw 10KB
application.properties 630B
application.properties 630B
maven-wrapper.properties 218B
workspace.xml 9KB
pom.xml 3KB
UsersMapper.xml 876B
UsersMapper.xml 876B
compiler.xml 842B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_12_5.xml 760B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_5_5.xml 737B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 724B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_12_5.xml 719B
Maven__org_springframework_boot_spring_boot_starter_logging_2_5_5.xml 716B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_5_5.xml 709B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_12_5.xml 705B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_5_5.xml 702B
Maven__org_springframework_boot_spring_boot_starter_json_2_5_5.xml 695B
Maven__org_springframework_boot_spring_boot_starter_test_2_5_5.xml 695B
Maven__org_springframework_boot_spring_boot_starter_jdbc_2_5_5.xml 695B
Maven__org_springframework_boot_spring_boot_starter_web_2_5_5.xml 688B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_53.xml 684B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_12_5.xml 675B
Maven__com_baomidou_mybatis_plus_boot_starter_3_4_3_4.xml 668B
Maven__org_springframework_boot_spring_boot_starter_2_5_5.xml 660B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 657B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 657B
Maven__org_junit_platform_junit_platform_commons_1_7_2.xml 657B
Maven__com_baomidou_mybatis_plus_annotation_3_4_3_4.xml 654B
Maven__com_fasterxml_jackson_core_jackson_databind_2_12_5.xml 654B
Maven__org_junit_platform_junit_platform_engine_1_7_2.xml 650B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_53.xml 649B
Maven__com_baomidou_mybatis_plus_extension_3_4_3_4.xml 647B
Maven__org_springframework_boot_spring_boot_test_2_5_5.xml 639B
Maven__org_junit_jupiter_junit_jupiter_engine_5_7_2.xml 639B
Maven__org_junit_jupiter_junit_jupiter_params_5_7_2.xml 639B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml 635B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_53.xml 635B
Maven__org_springframework_spring_expression_5_3_10.xml 633B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_14_1.xml 632B
Maven__com_fasterxml_jackson_core_jackson_core_2_12_5.xml 626B
Maven__org_mockito_mockito_junit_jupiter_3_9_0.xml 622B
Maven__org_junit_jupiter_junit_jupiter_api_5_7_2.xml 618B
Maven__org_springframework_spring_context_5_3_10.xml 612B
Maven__com_baomidou_mybatis_plus_core_3_4_3_4.xml 612B
Maven__net_bytebuddy_byte_buddy_agent_1_10_22.xml 609B
Maven__org_springframework_spring_webmvc_5_3_10.xml 605B
Maven__org_springframework_boot_spring_boot_2_5_5.xml 604B
Maven__mysql_mysql_connector_java_8_0_16.xml 598B
Maven__org_springframework_spring_beans_5_3_10.xml 598B
Maven__org_apache_logging_log4j_log4j_api_2_14_1.xml 597B
Maven__org_apiguardian_apiguardian_api_1_1_0.xml 596B
Maven__ch_qos_logback_logback_classic_1_2_6.xml 592B
Maven__org_springframework_spring_core_5_3_10.xml 591B
Maven__org_springframework_spring_test_5_3_10.xml 591B
Maven__org_springframework_spring_jdbc_5_3_10.xml 591B
Maven__org_junit_jupiter_junit_jupiter_5_7_2.xml 590B
Maven__org_springframework_spring_web_5_3_10.xml 584B
Maven__org_springframework_spring_aop_5_3_10.xml 584B
Maven__org_springframework_spring_jcl_5_3_10.xml 584B
Maven__net_minidev_accessors_smart_2_4_7.xml 580B
Maven__org_springframework_spring_tx_5_3_10.xml 577B
Maven__com_baomidou_mybatis_plus_3_4_3_4.xml 577B
Maven__org_mybatis_mybatis_spring_2_0_6.xml 573B
Maven__ch_qos_logback_logback_core_1_2_6.xml 571B
Maven__com_github_jsqlparser_jsqlparser_4_2.xml 571B
Maven__com_jayway_jsonpath_json_path_2_5_0.xml 570B
Maven__net_bytebuddy_byte_buddy_1_10_22.xml 567B
Maven__org_assertj_assertj_core_3_19_0.xml 566B
Maven__org_skyscreamer_jsonassert_1_5_0.xml 561B
共 116 条
- 1
- 2
资源评论
一枚开发小咸鱼
- 粉丝: 1108
- 资源: 47
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功