当输入如下密码时
yeast bulk seize is shows pain
每个人都可以听到敲击空格键的声音,因此在密码字段中显示空格似乎也是合乎逻辑的。所以我想要一些能够展示的东西
***** **** ***** ** ***** ****
代替
******************************
这将使打字变得更容易,同时几乎不会降低安全性。
UPDATE
在更新 Riduidel 的评论之前请三思。什么时候布鲁斯·施奈尔写道 http://www.schneier.com/blog/archives/2009/06/the_problem_wit_2.html “是时候以明文形式显示大多数密码了”,那么显示其中的一小部分也一定是正确的。特别是展示一个只需聆听就能捕捉到的部分。
这是一个使用的变体setEchoChar() http://download.oracle.com/javase/6/docs/api/javax/swing/JPasswordField.html#setEchoChar%28char%29使密码在预定义的时间内可见:例如三秒。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.Timer;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/** @see http://stackoverflow.com/questions/5339702 */
public class PasswordTest {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
private static void createAndShowGui() {
JFrame jf = new JFrame("Test Password");
JPasswordField jpwd = new JPasswordField();
TimedPasswordListener tpl = new TimedPasswordListener(jpwd);
jpwd.getDocument().addDocumentListener(tpl);
jf.add(jpwd);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
jf.pack();
jf.setVisible(true);
}
}
class TimedPasswordListener implements DocumentListener, ActionListener {
private Timer timer = new Timer(3000, this);
private char echoChar;
private JPasswordField pwf;
public TimedPasswordListener(JPasswordField jp) {
pwf = jp;
timer.setRepeats(false);
}
public void insertUpdate(DocumentEvent e) {
showText(e);
}
public void removeUpdate(DocumentEvent e) {
showText(e);
}
public void changedUpdate(DocumentEvent e) {}
public void showText(DocumentEvent e) {
if (0 != pwf.getEchoChar()) {
echoChar = pwf.getEchoChar();
}
pwf.setEchoChar((char) 0);
timer.restart();
}
public void actionPerformed(ActionEvent e) {
pwf.setEchoChar(echoChar);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)