6

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

4

1 回答 1

3

当您没有为组件设置任何操作命令时,其中的文本将是操作命令。这就是您获取密码的原因。

即使对于JTextField

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

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

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

不要尝试将动作命令设置为null,如果是null,则 中的文本JPasswordField将是动作命令。问题又来了。

因此,我建议您为 设置一些操作命令,而JPasswordField不要像现在这样离开它,直到 Oracle 纠正它。

JPasswordField jt=new JPasswordField("text");
        jt.setActionCommand("");
        jt.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println(ae.getActionCommand());
            }
        });
于 2013-07-17T13:43:33.080 回答