如何在ADF Faces中处理密码字符串?

时间:2014-02-19 14:32:16

标签: java jsf passwords oracle-adf

根据公司政策(和其他建议),我们不应该使用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不是一个好主意。

2 个答案:

答案 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;
}

希望这有帮助。