带动作命令的JPasswordField安全性

我在我的程序中使用JPasswordField 。 当我问getPassword() ,我得到一个char[]数组。 但是当我向JPasswordField添加ActionListener并询问getActionCommand() ,我将密码作为String 。 此密码是否在事件对象中保存为String这不是一个安全问题吗?

为组件设置无动作命令时,其中的文本将是动作命令。 这就是您获取密码的原因。

即使对于JTextField也是如此

 JTextField jt=new JTextField("text"); jt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae) { System.out.println(ae.getActionCommand()); } }); 

这是一个安全问题,因为您获取的密码为String,它是不可变的而不是char[]

每当未设置显式操作命令时,组件中的文本将被发送到ActionEvent构造函数,尽管您没有将其专门设置为操作命令。 尽管command参数可以为null ,但建议不要为null ,因此默认情况下组件中的文本是action命令。 如果JPasswordField没有密码,则空字符串将是action命令。

不要尝试将action命令设置为null ,如果为null ,则JPasswordField的文本将是action命令。 问题再次出现。

因此,我建议您为JPasswordField设置一些操作命令,而不会像现在这样保留它,直到Oracle对此进行纠正。

 JPasswordField jt=new JPasswordField("text"); jt.setActionCommand(""); jt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae) { System.out.println(ae.getActionCommand()); } });