当前位置:网站首页>jdbc ResultSetMetaData获取tableName问题
jdbc ResultSetMetaData获取tableName问题
2022-07-30 07:20:00 【hay_lee】
1.问题
有一个项目客户提出对已上线项目,不改代码的情况下,并且只能提供是jdbc连接与数据库mysql、oracle两种。对客户的需求做了大量的技术调研,mysql jdbc驱动可以使用自定义拦截器实现,但是oracle jdbc驱动没有这个。后来考虑使用java字节码增强形式对jdbc返回结果做拦截脱敏。但是在脱敏的过程当中发现oracle jdbc驱动执行完的sql ResultSet获取ResultSetMetaData中的getTableName方法获取的表名为空。
2.寻找解决方法
因为制定的脱敏规则设置某个表某个字段按照某种规则脱敏。但是现在oracle jdbc驱动无法获取TableName。
经过查oracle官方发现:


可以这么设置(注意:这里只举个例子,其他属性没加)
Properties info = new Properties();
info.setProperty("ResultSetMetaDataOptions","1");
jdbcHandler = JdbcHandler.newJdbcHandler(url, info);但是设置完依然获取不到TableName。
无奈去翻oracle ojdbc源码发现

发现源码未实现。
最后想用实际项目postgres做测试发现增强后查询数据库死循环,翻看源码:


pg查询表名是去再次用sql查询数据库,因为增强的返回结果方法查询表名触发继续去查表名就成了死循环。
最终无奈oracle、postgres只能根据列别名脱敏,无法知道表放弃。mysql可以获取表名、原始表列名、列别名、用户名、数据库名,完全按照这些制定规则脱敏。这篇文章是提醒大家避免入坑,解决方法还在继续探索中。。。
边栏推荐
猜你喜欢
随机推荐
OA Project Pending Meeting & History Meeting & All Meetings
typescript8 - type annotations
ES:解构
通过位运算进行两个变量值的交换功能
tabindex attribute of input tag & tabindex attribute of a tag
孙洪鹤讲教材:原点+众筹+产品,逆向营销实战操作方案
【小程序专栏】总结uniapp开发小程序的开发规范
typescript1 - what is typescript
潜心打磨,主动求变——这群技术排头兵,如何做好底层开发这件事?
Distributed lock development
Limit injection record of mysql injection in No. 5 dark area shooting range
函数(1)
Link with Bracket Sequence II(杭电多校赛)
stack containing min function (js)
SOFA Weekly|Meetup 广州站、本周 QA、本周 Contributor
Burpsuite几种爆破方式
SE11 创建搜索帮助
C# uses RestSharp to implement Get, Post requests (2)
一文带你玩转offer-01
Risk Register









