【问题标题】:Browser autofills wrong fields in Wicket formpanel浏览器自动填充 Wicket 表单中的错误字段
【发布时间】:2014-03-07 09:09:29
【问题描述】:

我正在使用 Wicket 表单面板来允许 web 应用程序的管理员编辑用户帐户数据。有一个密码字段,管理员可以在其中为用户和其他帐户数据字段设置新密码。当我打开表单面板时,浏览器会使用我保存在浏览器中的密码自动填充密码字段。默认情况下,此字段应留空。此外,浏览器会在手机号码字段中插入我的用户名(“admin”)!

有没有办法通过更改表单域的代码来避免这种行为?例如禁止自动填充或类似的东西? 以下是相关代码部分:

        mobile = new TextField<String>("mobile");
    mobile.add(PhonenumberValidator.getInstance());
    mobile.setOutputMarkupId(true);
    addToForm(new FencedFeedbackPanel("mobileCfp", mobile));
    addToForm(mobile);
    generatedPassword = new GeneratedPasswordLabelPanel("generatedPassword");
    generatedPassword.setOutputMarkupId(true);
    generatePassword = new IndicatingAjaxLink<Void>("generatePassword"){
        private static final long serialVersionUID = 6759645521399346111L;

        @Override
        public void onClick(AjaxRequestTarget target) {
            generatedPasswordString = PasswordGenerator.generatePassword(8);
            generatedPassword.setPasswordString(generatedPasswordString);
            target.add(generatedPassword);
        }
    };
    newPassword = new PasswordTextField("newPassword");
    newPassword.add(PasswordValidator.getInstance());
    newPassword.setOutputMarkupId(true);
    newPassword.setModel(new Model<String>());
    newPassword.setRequired(false);
    newPassword.setResetPassword(true);
    newPassword.add(new RequiredLabelBehavior());
    confirmPassword = new PasswordTextField("confirmPassword");
    confirmPassword.setOutputMarkupId(true);
    confirmPassword.setModel(new Model<String>());
    confirmPassword.setRequired(false);
    confirmPassword.setResetPassword(true);
    confirmPassword.add(new RequiredLabelBehavior());
    pwContainer = new WebMarkupContainer("pwContainer");
    pwContainer.add(confirmPassword);
    pwContainer.add(newPassword);
    pwContainer.add(generatePassword);
    pwContainer.add(generatedPassword);
    pwContainer.add(new FencedFeedbackPanel("newPasswordCfp", newPassword));
    pwContainer.add(new FencedFeedbackPanel("confirmPasswordCfp", confirmPassword));
    pwContainer.setVisible(ajax);
    addToForm(pwContainer);

这是 Wicket-Html 代码:

<?xml version="1.0" encoding="UTF-8"?>

        <div wicket:id="emailCfp" />
        <input wicket:id="email" type="text" />
        <div class="brclear"></div>

        <select wicket:id="account.salutation" />
        <div class="brclear"></div>

        <input wicket:id="title" type="text" style="width:100px" />
        <div class="brclear" />

        <div wicket:id="firstnameCfp" />
        <input wicket:id="firstname" type="text" />
        <div class="brclear"></div>

        <div wicket:id="lastnameCfp" />
        <input wicket:id="lastname" type="text" />
        <div class="brclear"></div>

        <div wicket:id="phoneCfp" />
        <label><wicket:message key="phone" /></label><input wicket:id="phone" type="text" />
        <div class="brclear"></div>

        <div wicket:id="birthday" />
        <div class="brclear" />

        <div wicket:id="mobileCfp" />
        <label><wicket:message key="mobile" /></label><input wicket:id="mobile" type="text" />
        <div class="brclear"></div>
    </fieldset>

    <fieldset wicket:id="imageContainer">
        <legend><wicket:message key="legend.picture" /></legend>
        <div>
            <img style="float: left; margin: 0px 5px 5px 0px;" wicket:id="userImage" />
            <br />
            <span wicket:id="blob"></span>
        </div>
    </fieldset>

    <fieldset wicket:id="pwContainer">
        <legend><wicket:message key="legend.pw" /></legend>
        <input type="button" wicket:id="generatePassword" wicket:message="value:generatePassword" />
        <div style="float:left;">
            <div wicket:id="generatedPassword" />
        </div>
        <div class="brclear"></div>

        <div wicket:id="newPasswordCfp" />
        <input wicket:id="newPassword" type="password" />
        <div class="brclear"></div>

        <div wicket:id="confirmPasswordCfp" />
        <input wicket:id="confirmPassword" type="password" />
        <div class="brclear"></div>
    </fieldset>

    <wicket:child />

</wicket:extend>

谢谢!

【问题讨论】:

  • 在这种情况下,HTML 代码可能更有帮助,因为浏览器将无法访问您的 java 代码。我认为,自动填充的文本字段将具有 name="password" 或 "username",因此会自动填充。
  • 请接受答案或发表评论。

标签: java wicket autofill


【解决方案1】:

以下代码将向您展示如何禁用 HTML 表单的自动填充。我认为这就是你所需要的。但我不知道如何在 Java 中设置这个值。 autocomplete="off" 是魔术参数。

<form action="demo_form.asp" method="get" autocomplete="off">
   First name:<input type="text" name="fname"><br>
   E-mail: <input type="email" name="email"><br>
   <input type="submit">
</form>

编辑:我在 https://issues.apache.org/jira/browse/WICKET-1504 找到了一些东西,但我不确定它是否有效。 newPassword.put("autocomplete", "off"); 用户名输入字段对象也是如此。

【讨论】:

  • 要实现这一点,需要使用newPassword.add( AttributeModifier.replace("autocomplete", "off") )(Wicket 6,在 Wicket 1.5 中有点不同)
猜你喜欢
  • 2012-02-01
  • 2021-08-30
  • 2017-08-22
  • 1970-01-01
  • 2013-04-04
  • 2016-03-30
  • 2021-02-25
  • 2012-04-17
  • 2016-08-07
相关资源
最近更新 更多