如何防止mybatis varchar进入java中的字符串池?
How to prevent a mybatis varchar from entering the string pool in java?
我们的数据库中有几个敏感字段,需要防止它们进入 Java 字符串池。数据库中都是VARCHAR,我们在代码中使用了StringBuilder,防止它们被放到常量池中。
我们使用 MyBatis 与数据库交互,我目前正在尝试实现一个类型处理程序,我正在尝试使用 setObject 将 StringBuilder 映射到 Varchar。
我想知道这是否可能,如果可能的话,在 MyBatis 和 JDBC 之间是否还有其他区域,这意味着不能保证 VARCHAR 不会在字符串池中结束? (在代码中强制转换,语句以字符串形式出现,诸如此类)
我也在 mybatis-users google 群里问过这个问题,但到目前为止还没有人能提供帮助
编辑 - 我应该澄清一下,这并不是严格意义上的字符串池,它是关于控制数据在堆上的位置并通过用空值覆盖尽快从可变 CharSequence 中擦除数据。字符串绝对不能进入池中,但由于垃圾收集的工作方式,简单地将不在池中的字符串置空仍然会导致安全问题。
不确定这是否有帮助,但可以。
首先,创建一个客户TypeHandler
(扩展 org.apache.ibatis.type.BaseTypeHandler
或
实施 org.apache.ibatis.type.TypeHandler
) 来处理您的专栏。
而不是 "standard" 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
接口后,
您将需要注册您的类型处理程序和
为所需的列配置它。
这是一个reference page
我们的数据库中有几个敏感字段,需要防止它们进入 Java 字符串池。数据库中都是VARCHAR,我们在代码中使用了StringBuilder,防止它们被放到常量池中。
我们使用 MyBatis 与数据库交互,我目前正在尝试实现一个类型处理程序,我正在尝试使用 setObject 将 StringBuilder 映射到 Varchar。
我想知道这是否可能,如果可能的话,在 MyBatis 和 JDBC 之间是否还有其他区域,这意味着不能保证 VARCHAR 不会在字符串池中结束? (在代码中强制转换,语句以字符串形式出现,诸如此类)
我也在 mybatis-users google 群里问过这个问题,但到目前为止还没有人能提供帮助
编辑 - 我应该澄清一下,这并不是严格意义上的字符串池,它是关于控制数据在堆上的位置并通过用空值覆盖尽快从可变 CharSequence 中擦除数据。字符串绝对不能进入池中,但由于垃圾收集的工作方式,简单地将不在池中的字符串置空仍然会导致安全问题。
不确定这是否有帮助,但可以。
首先,创建一个客户TypeHandler
(扩展 org.apache.ibatis.type.BaseTypeHandler
或
实施 org.apache.ibatis.type.TypeHandler
) 来处理您的专栏。
而不是 "standard" 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
接口后,
您将需要注册您的类型处理程序和
为所需的列配置它。
这是一个reference page