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

标签 java vaadin vaadin7

对于密码值,字符串易受攻击。我注意到 Vaadin PasswordFieldpassword 作为 String 进行操作。

以下是 PasswordField 的默认构造函数,

public PasswordField() {
  setValue("");
}

我的问题:

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

最佳答案

TL;DR 瓦丁 PasswordField 是一个简单的 TextField .输入仅在客户端隐藏,在服务器端以明文形式传输。

尽管您可以使用 getConvertedValue() setConvertedValue(Object value) 用于获取/设置您自己类型的值。请注意,您必须设置 setConverter(Converter<T,?> converter) 在使用之前。

这里有一个如何正确使用对话的例子:Creating your own converter for String - MyType conversion


完整解释

Vaadin TextField , PasswordField TextArea 都是 AbstractField<String> 的 child .

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

PasswordField String 一起工作因为它的 parent ,否则它应该实现AbstractField<char[]> .

另外在 PasswordField section from Vaadin Docs明确地说:

You should note that the PasswordField hides the input only from "over the shoulder" visual observation. Unless the server connection is encrypted with a secure connection, such as HTTPS, the input is transmitted in clear text and may be intercepted by anyone with low-level access to the network. Also phishing attacks that intercept the input in the browser may be possible by exploiting JavaScript execution security holes in the browser.


尽管 AbstractField<T> getConvertedValue() setConvertedValue(Object value) 这允许获取/设置 Object 中的值你比较喜欢。请注意,在使用它之前,您需要设置 setConverter(Converter<T,?> converter) .

这里有一个如何正确使用对话的例子:Creating your own converter for String - MyType conversion

举个例子:

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

主类

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();
    }

}));

完整来源

关于java - 为什么 PasswordField 在 Vaadin 中使用 String 而不是 char[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888940/

相关文章:

Java 8 Lambda 指定映射类型并使其不可修改

java - 查找最小必要的 java 类路径

java - 在解析 json 数组的适配器类中实现搜索过滤器(不使用 pojo)

java - 如何在vaadin中获取元素ID

java - 在 android 中创建数据表的最佳方法是什么?

java - 如何从 DateField 中提取日期为不同的格式?

java - 如何允许用户在 vaadin 表中拖放行?

java - Vaadin 网格单元不显示多行行

java - 我将GWT依赖项添加到vaadin项目时无法启动tomcat

vaadin - 使用 Vaadin 声明式 UI 时如何设置自定义字体图标?