0

我们的数据库中有几个敏感字段需要防止进入 Java 字符串池。在数据库中都是 VARCHAR,我们在代码中使用 StringBuilders 来防止它们被放入常量池中。

我们使用 MyBatis 与数据库交互,我目前正在尝试实现一个类型处理程序,我正在尝试使用 setObject 将 StringBuilder 映射到 Varchar 到。

我想知道这是否可能,如果可能,MyBatis 和 JDBC 之间是否还有其他区域,这意味着不能保证 VARCHAR 不会在字符串池中结束?(在代码中强制转换,语句以字符串形式出现,诸如此类)

我也在 mybatis-users google group 上问过这个问题,但到目前为止没有人能够在那里提供帮助

编辑 - 我应该澄清一下,这并不是严格意义上的字符串池,而是控制数据在堆上的位置,并通过用空值覆盖尽快从可变 CharSequence 中擦除数据。字符串绝对不能进入池,但简单地将不在池中的字符串清空仍然会由于垃圾收集的工作方式而导致安全问题。

4

1 回答 1

2

不确定这是否会有所帮助,但是可以。

首先,创建一个客户 TypeHandler(扩展org.apache.ibatis.type.BaseTypeHandler或实现org.apache.ibatis.type.TypeHandler)来处理您的列。

而不是“标准” varchar 到 String 实现:

@Override
public String getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    return rs.getString(columnIndex);
}

实现这个

@Override
public StringBuilder getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    final StringBuilder returnValue = new StringBuilder();
    final byte[] value = rs.getbytes(columnIndex);

    // add the bytes to the StringBuilder.

    return returnValue;
}

实现整个TypeHandler接口后,您将需要注册类型处理程序并为所需的列配置它。

这是一个参考页面

于 2016-08-30T18:03:07.047 回答