根据公司政策(和其他建议),我们不应该使用String类来处理密码。因为这些对象是不可变的并且可能存在直到GC解除分配它,所以“内存检查”可能会显示一个尚未释放的包含密码的String。所以替代方法是使用char []而不是一次需要覆盖它的内容。但是,使用时 inputText组件,setter方法必须接收String。
我有一个inputText,如:
<af:inputText value="{myBean.password}" secret="true"/>
和
public class MyBean {
...
private transient char[] password;
...
public void setPassword(String password) {
this.password = password.toCharArray();
}
...
public void sumbit(ActionEvent e) {
...
//Wipe password
for(int i = 0 ; i < password.length ; i++) { password[i] = ' '; }
password = null;
}
}
正如您所看到的,仍然有一个包含密码的String对象(setter的参数),我不知道如何处理该值。有没有办法获得char []值? ADF的循环是否考虑到这是一个密码,应该做一些特别的事情?
这是一台服务器并且调用CG不是一个好主意。
答案 0 :(得分:1)
我能想到的一种方法是使用JavaScript加密库以加密格式将密码字段的值从客户端传递到服务器,并在服务器上解密。这样接收字符串将采用非纯文本格式。
答案 1 :(得分:1)
不要将组件的值保留在bean中,而是保持对组件本身的引用:
Error [237] S:\PIC_Code\ACCEED_4420\Source\acceed1480.c; 23. function "_initGpio" redefined
并在动作侦听器中从组件中获取值:
<af:inputText bindings="{myBean.password}" secret="true"/>
......
private RichInputText password;
......
public void setPassword(RichInputText password) {
this.password = password;
}
public RichInputText getPassword() {
return password;
}
希望这有帮助。