
在开发管理系统时,我们经常遇到这样的困扰:在表单中,浏览器"自作聪明"地提示保存的账号密码,甚至自动填充到错误的字段中。这不仅影响用户体验,还可能造成安全风险。

<el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="string"
placeholder="请输入管理人登录名"
autocomplete="off" <!-- 试图禁用自动填充 -->
:disabled="hqTable.form.operate === 'Edit'"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
:show-password="!hqTable.form.items?.id"
autocomplete="new-password" <!-- 使用浏览器建议的值 -->
></el-input>
</el-form-item>autocomplete="off"经常失效?autocomplete="off"name、id、label等属性识别密码字段<el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="请输入管理人登录名"
autocomplete="username" <!-- 明确告诉浏览器这是用户名 -->
:disabled="hqTable.form.operate === 'Edit'"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
:show-password="!hqTable.form.items?.id"
autocomplete="new-password" <!-- 明确表示这是新密码 -->
></el-input>
</el-form-item><el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="请输入管理人登录名"
autocomplete="nope" <!-- 使用无意义的值 -->
:disabled="hqTable.form.operate === 'Edit'"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
:show-password="!hqTable.form.items?.id"
autocomplete="new-password-${Date.now()}" <!-- 动态随机值 -->
></el-input>
</el-form-item>import { onMounted, ref, nextTick } from 'vue'
const formRef = ref()
// 在打开新增表单时禁用自动填充
const openAddForm = () => {
hqTable.toggleForm('Add')
nextTick(() => {
// 动态设置autocomplete属性
const inputs = formRef.value?.$el.querySelectorAll('input')
inputs.forEach(input => {
if (input.type === 'password') {
input.setAttribute('autocomplete', 'new-password')
} else if (input.name.includes('login') || input.name.includes('user')) {
input.setAttribute('autocomplete', 'username')
} else {
input.setAttribute('autocomplete', 'off')
}
})
})
}
// 在编辑模式下启用合理的自动填充
const openEditForm = () => {
hqTable.toggleForm('Edit')
nextTick(() => {
const inputs = formRef.value?.$el.querySelectorAll('input')
inputs.forEach(input => {
input.setAttribute('autocomplete', 'on')
})
})
}<!-- 在真实表单前添加隐藏的欺骗字段 -->
<div style="display: none;">
<input type="text" name="fake-username" autocomplete="username">
<input type="password" name="fake-password" autocomplete="current-password">
</div>
<el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="请输入管理人登录名"
autocomplete="new-username" <!-- 使用非标准值 -->
name="new-login-name" <!-- 避免使用敏感字段名 -->
:disabled="hqTable.form.operate === 'Edit'"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
:show-password="!hqTable.form.items?.id"
autocomplete="new-password"
name="new-user-password" <!-- 使用非标准字段名 -->
></el-input>
</el-form-item><el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="请输入管理人登录名"
autocomplete="username"
name="register-username"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
autocomplete="new-password"
name="register-password"
></el-input>
</el-form-item><el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="登录名(不可修改)"
autocomplete="off"
:disabled="true"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="留空表示不修改密码"
autocomplete="new-password"
></el-input>
</el-form-item>autocomplete值比简单禁用更好<!-- 避免敏感信息自动填充 -->
<input autocomplete="one-time-code"> <!-- 验证码 -->
<input autocomplete="transaction-amount"> <!-- 金额 -->// 在合适的场景启用自动填充
const shouldAutocomplete = computed(() => {
return hqTable.form.operate === 'Edit' ? 'on' : 'new-password'
})// 自动化测试验证自动填充行为
describe('表单自动填充测试', () => {
it('新增表单应该禁用密码记忆', () => {
// 测试autocomplete属性值
})
it('编辑表单应该允许合理的自动填充', () => {
// 验证用户体验
})
})<template>
<el-form ref="formRef" :model="hqTable.form.items">
<!-- 欺骗字段 -->
<div style="display: none;">
<input type="text" autocomplete="username">
<input type="password" autocomplete="current-password">
</div>
<el-form-item prop="loginName" label="登录名">
<el-input
v-model="hqTable.form.items!.loginName"
type="text"
placeholder="请输入管理人登录名"
:autocomplete="autocompleteConfig.username"
:disabled="hqTable.form.operate === 'Edit'"
></el-input>
</el-form-item>
<el-form-item prop="loginPassword" label="登录密码">
<el-input
v-model="hqTable.form.items!.loginPwd"
type="password"
placeholder="请输入管理人登录密码"
:show-password="!hqTable.form.items?.id"
:autocomplete="autocompleteConfig.password"
></el-input>
</el-form-item>
</el-form>
</template>
<script setup>
import { computed } from 'vue'
const autocompleteConfig = computed(() => {
const isEdit = hqTable.form.operate === 'Edit'
return {
username: isEdit ? 'username' : 'new-username',
password: isEdit ? 'current-password' : 'new-password'
}
})
</script>通过以上方案,可以根据具体业务场景灵活控制浏览器的自动填充行为,既保证安全性又不牺牲用户体验。
您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。