为什么PasswordField在Vaadin中使用String而不是char []?

Cod*_*roc 7 java vaadin vaadin7

字符串容易受到密码值的影响.我注意到Vaadin PasswordField操纵密码String.

以下是默认构造函数PasswordField,

public PasswordField() {
  setValue("");
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • PasswordField在Vaadin 使用是否安全?
  • 什么内部API可以确保密码的安全性?

Pao*_*gia 5

TL; DR Vaadin PasswordField很简单TextField.输入隐藏在客户端,服务器端以明文形式传输.

虽然您可以使用getConvertedValue()setConvertedValue(Object value)获取/设置您自己类型的值.请注意,您必须先设置setConverter(Converter<T,?> converter)之前使用它.

这里有一个如何正确使用对话的示例:为String创建自己的转换器 - MyType转换


完整解释

Vaadin TextField,PasswordField并且TextArea是所有的孩子AbstractField<String>.

Vaadin Docs TextField

详细地:

java.lang.Object
  |_ com.vaadin.server.AbstractClientConnector
       |_ com.vaadin.ui.AbstractComponent
            |_ com.vaadin.ui.AbstractField<java.lang.String>
                 |_ com.vaadin.ui.AbstractTextField
Run Code Online (Sandbox Code Playgroud)

PasswordField与工作String,因为它的父母,否则就应该已经实现AbstractField<char[]>.

此外,PasswordFieldVaadin Docs部分明确指出:

您应该注意,PasswordField隐藏输入仅来自"过肩"目视观察.除非使用安全连接(例如HTTPS)对服务器连接进行加密,否则输入将以明文形式传输,并且可能被对网络进行低级访问的任何人拦截.此外,通过利用浏览器中的JavaScript执行安全漏洞,可以拦截拦截浏览器中输入的网络钓鱼攻击.


虽然 AbstractField<T>getConvertedValue()setConvertedValue(Object value)哪个允许获得/设置Object您喜欢的值.请注意,在使用之前,您需要进行设置setConverter(Converter<T,?> converter).

这里有一个如何正确使用对话的示例:为String创建自己的转换器 - MyType转换

简而言之,这个例子:

Name是一个简单的POJOfirstNamelastName领域,他们的getter/setter.

转换器类

public class StringToNameConverter implements Converter<String, Name> {

    public Name convertToModel(String text, Locale locale) {
        String[] parts = text.split(" ");
        return new Name(parts[0], parts[1]);
    }

    public String convertToPresentation(Name name, Locale locale)
            throws ConversionException {
        return name.getFirstName() + " " + name.getLastName();
    }

    public Class<Name> getModelType() {
        return Name.class;
    }

    public Class<String> getPresentationType() {
        return String.class;
    }
}
Run Code Online (Sandbox Code Playgroud)

主要课程

Name name = new Name("Rudolph", "Reindeer");
final TextField textField = new TextField("Name");
textField.setConverter(new StringToNameConverter());
textField.setConvertedValue(name);
addComponent(textField);
addComponent(new Button("Submit value", new ClickListener() {

    public void buttonClick(ClickEvent event) {
        Name name = (Name) textField.getConvertedValue();
    }

}));
Run Code Online (Sandbox Code Playgroud)

完整来源