页面上总共有3种表格。 两种用于用户输入,第三种是实际需要提交的表单。
表1是通常的登录名,其中包含用户名和密码。 表单被提交并检查有效性(javascript和PHP)。 如果全部签出(即用户名和密码与MySQL DB中的内容匹配),则用户名和密码将填充到第三种表单中以进行提交。 如果用户名确实存在,但它是一个新帐户,则该用户将被重定向到表单2。即,隐藏了表单1,并显示了表单2。
表格2:输入,确认和确认新密码后,用户名和新密码将在第三张表格上传递。
应该在表3中进行魔术。 这是您能想到的最基本的形式。
它是通过我拦截了onsubmit的1或2表单的处理提交的。
第三种形式是在Apache中执行基于表单的身份验证。
如果我从网页上单独使用该表单,则会提交该表单,并按预期将我重定向到受保护的页面。 如果我从代码中提交页面,网页将被重新加载,但重定向从未发生。实际上,身份验证也不起作用。
我尝试通过PHP处理服务器端登录过程,但失败了,因为我使用的是基于表单的身份验证,而PHP服务器登录过程是用于基本身份验证或摘要身份验证的。
我试图动态地以及手动地创建第三种形式,但是没有任何处理。之所以会调用提交,是因为页面会重新加载,仅此而已。
环境 Ubuntu 16.04 具有基于表单的身份验证的Apache 用户数据库的MySQL PHP背后的代码 用于客户端编码的Javascript / jQuery
表格的精简版
<form class="validate-form" method="post" name="loginform">
<input type="hidden" name="formname" value="login">
<input type="text" name="login_username" placeholder="Username">
<input type="password" name="login_password" placeholder="Password">
<button>Login</button>
</form>
<form class="validate-form" method="post" name="changepasswd" style="display:none;">
<input type="hidden" name="formname" value="reset">
<input type="password" name="new_password" placeholder="New Password">
<input type="password" name="confirm_password" placeholder="Confirm Password">
<button>Reset password and Login</button>
</form>
<form method="POST" action="" name="submit_form" style="display:none;">
<input name="httpd_username">
<input name="httpd_password">
<button>Login</button>
</form>
$('.validate-form').on('submit',function(){
var workform = 'loginform';
var check = true;
if ($('form[name=resetform]').is(":visible")) workform = 'resetform';
// Validating the entries (not empty, format,...)
//...
if (check) {
if (workform == 'loginform') { //Processing Form 1
//send to PHP for processing
//...
var response = xhreq.responseText.trim().split(":");
// The response looks like i:information or w:warning or e:error message
var success = true;
switch (response[0]) {
case 'i':
//username and password checks out against the database,
//now populating form 3 for submission:
$('input[name=httpd_username]').val($('input[name=login_username]').val().trim());
$('input[name=httpd_password]').val($('input[name=login_password]').val().trim());
$('form[name=submit_form]').submit(); // and submitting the form
break;
case 'w': // showing for 2 and hiding for 1 to change the Password
success = false;
break;
case 'e': // error processing
success = false;
break;
default:
success = false;
}
return success;
} else { //Processing Form 2
//send to PHP for processing
//...
var response = xhreq.responseText.trim().split(":");
// same response format as for form 1
var success = true;
switch (response[0]) {
case 'i':
$('input[name=httpd_username]').val($('input[name=login_username]').val().trim());
$('input[name=httpd_password]').val($('input[name=new_password]').val().trim());
$('form[name=submit_form]').submit();
break;
case 'w':
alert(response[1]);
success = false;
break;
case 'e': // error processing
success = false;
break;
default:
success = false;
}
return success;
}
} else { //form 1 or 2 validation failed
return false;
}
});
预期结果:提交表格3,并将我重定向到受限制的页面
实际结果:提交表格3,未进行身份验证,仍然拒绝访问受限页面。
答案 0 :(得分:0)
已修复!
当由于某种原因导致登录凭据不符合预期时,我返回false;而在服务器端response[0]='i'
上签出凭据时,我返回true。
将返回始终设置为 false 时,将执行表格3上的登录过程。
我对表格1和2的验证功能变为:
$('.validate-form').on('submit',function(){
var workform = 'loginform';
var check = true;
if ($('form[name=resetform]').is(":visible")) workform = 'resetform';
// Validating the entries (not empty, format,...)
//...
if (check) {
if (workform == 'loginform') { //Processing Form 1
//send to PHP for processing
//...
var response = xhreq.responseText.trim().split(":");
// The response looks like i:information or w:warning or e:error message
switch (response[0]) {
case 'i':
//username and password checks out against the database,
//now populating form 3 for submission:
$('input[name=httpd_username]').val($('input[name=login_username]').val().trim());
$('input[name=httpd_password]').val($('input[name=login_password]').val().trim());
$('form[name=submit_form]').submit(); // and submitting the form
break;
case 'w': // showing for 2 and hiding for 1 to change the Password
break;
case 'e': // error processing
break;
default:
}
return false;
} else { //Processing Form 2
//send to PHP for processing
//...
var response = xhreq.responseText.trim().split(":");
// same response format as for form 1
switch (response[0]) {
case 'i':
$('input[name=httpd_username]').val($('input[name=login_username]').val().trim());
$('input[name=httpd_password]').val($('input[name=new_password]').val().trim());
$('form[name=submit_form]').submit();
break;
case 'w':
alert(response[1]);
break;
case 'e': // error processing
break;
default:
}
return false;
}
} else { //form 1 or 2 validation failed
return false;
}
});