在codeigniter中如何使用ajax登录后重定向
Posted
技术标签:
【中文标题】在codeigniter中如何使用ajax登录后重定向【英文标题】:In codeigniter How to redirect after login using ajax 【发布时间】:2017-09-19 11:08:21 【问题描述】:我有一个登录弹出模式。我正在通过 ajax 登录
模态
<div class="modal-body">
<form action="<?php echo base_url('Login');?>" method="POST">
<div class="form-group">
<input type="text" placeholder="Email or Mobile*" value="" id="loginEmail" name="email" class="form-control input-feild">
</div>
<div class="form-group">
<input type="password" placeholder="Password*" value="" id="loginPassword" name="password" class="form-control input-feild">
</div>
<div class="form-group">
<input type="button" id="l_submit" name="l_submit" value="Login" class="btn btn-primary input-feild">
</div>
</form>
<p id="error-msg"></p>
</div>
我正在尝试使用 ajax 成功登录后重定向。如果电子邮件和密码正确,则重定向到任何页面。如果没有,那么它将显示错误。
控制器
function index()
$this->form_validation->set_rules('email', 'Email', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required');
if ($this->form_validation->run() == false)
echo validation_errors();
else
$email = $this->input->post("email");
$password = $this->input->post("password");
$user = $this->Perfect_mdl->check_user($email, $password);
if ($user)
$logged_in_data = array();
foreach ($user as $logged_in_data)
$logged_in_data = array(
'id' => $user[0]->id,
'email' => $user[0]->email
);
$this->session->set_userdata($logged_in_data);
$id = $this->session->userdata('email');
$data['details'] = $this->Perfect_mdl->get_login_user_detail($id);
echo "Yes";
else
echo "No";
这是我的控制器,我在其中检查登录用户电子邮件和密码是否正确。
这是我的脚本
<script type="text/javascript">
$("#l_submit").click(function()
var email = $("#loginEmail").val();
var password = $("#loginPassword").val();
$.ajax(
url : "<?php echo base_url('Login');?>",
type: 'POST',
data : 'email':email,'password':password,
success: function(msg)
if (msg == "Yes")
window.location.href = "<?php echo current_url(); ?>";
else if (msg == "No")
$('#error-msg').html('<div class="alert alert-danger text-center">Incorrect Email & Password. Please try again ...</div>');
else
$('#error-msg').html('<div class="alert alert-danger">' + msg + '</div>');
);
return false;
);
</script>
正如您在成功部分看到的,当我输入正确的电子邮件/密码时。它显示是。但是我想重定向另一个页面,为什么在正确的电子邮件/密码上显示 YES。在不正确的电子邮件/密码上显示 NO。
我哪里做错了???
【问题讨论】:
它显示YES
吗?它应该显示是?请调试您的代码。您是否检查了为什么if (msg == "Yes")
不起作用?您是否尝试提醒((msg == "Yes"))
进行一些调试
如果您使用的是ajax,为什么要提交表单?可能是您需要使用提交功能而不是点击
是的,我做到了,但是当(msg = "yes")
时,这并没有显示警告框
你应该把它放在 if 条件之上
是的,如果条件在上面放置警报框后,这会给我警报。
【参考方案1】:
您需要在 jQuery 和 Controller 函数中更改几行代码。在这里,我附上了您的代码的更新版本。请参考:
查看(引导模式)
<div class="modal-body">
<form action="<?php echo base_url('Login');?>" method="POST">
<div class="form-group">
<input type="text" placeholder="Email or Mobile*" value="" id="loginEmail" name="email" class="form-control input-feild">
</div>
<div class="form-group">
<input type="password" placeholder="Password*" value="" id="loginPassword" name="password" class="form-control input-feild">
</div>
<div class="form-group">
<input type="button" id="l_submit" name="l_submit" value="Login" class="btn btn-primary input-feild">
</div>
</form>
<p id="error-msg"></p>
</div>
这是您的视图文件。它将保持不变。单击按钮时,您已经编写了需要修改的脚本。附加控制器功能后会触发:
控制器
function index()
if (!$this->input->is_ajax_request())
echo 'No direct script is allowed';
die;
$this->form_validation->set_rules('email', 'Email', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required');
if ($this->form_validation->run() == false)
$result['status'] = 'error';
$result['message'] = validation_errors();
else
$email = $this->input->post("email");
$password = $this->input->post("password");
$user = $this->Perfect_mdl->check_user($email, $password);
if ($user)
$logged_in_data = array();
foreach ($user as $logged_in_data)
$logged_in_data = array(
'id' => $user[0]->id,
'email' => $user[0]->email
);
$this->session->set_userdata($logged_in_data);
$id = $this->session->userdata('email');
$data['details'] = $this->Perfect_mdl->get_login_user_detail($id);
$result['status'] = 'success';
$result['message'] = 'Yeah! You have successfully logged in.';
$result['redirect_url'] = base_url();
else
$result['status'] = 'error';
$result['message'] = 'Whoops! Incorrect Email & Password. Please try again';
$this->output->set_content_type('application/json');
$this->output->set_output(json_encode($result));
$string = $this->output->get_output();
echo $string;
exit();
脚本
<script type="text/javascript">
$("#l_submit").click(function()
var email = $("#loginEmail").val();
var password = $("#loginPassword").val();
$.ajax(
url : "<?php echo base_url('Login');?>",
type: 'POST',
data : 'email':email,'password':password,
success: function(resp)
if (resp.status == "success")
window.location.href = resp.redirect_url;
else
$('#error-msg').html('<div class="alert alert-danger">' + resp.message + '</div>');
);
return false;
);
这是正确的答案。如果您遇到任何问题,请告诉我。
【讨论】:
这对我不起作用,在错误消息中登录失败后显示未定义 @vishalkumar 尝试使用 consol.log(resp); 进行调试,如果条件如下:success: function(resp) consol.log(resp); if (resp.status == "success") window.location.href = resp.redirect_url; else $('#error-msg').html('<div class="alert alert-danger">' + resp.message + '</div>');
是的,但我没有显示任何类型的错误或警报。我没有收到任何类型验证错误,
@vishalkumar 你检查你的控制台了吗?如果响应有任何问题,它将显示错误。 (我正在考虑你正在使用萤火虫)
是的,我做了仍然没有显示验证错误消息。添加console.log($resp)
后,我在firebug 中得到了这个Object type: "error", message: "Incorrect Email/Password .....!"
但是为什么这没有显示任何验证错误。【参考方案2】:
如果您想从脚本跳转到另一个控制器/方法,您可以在代码中使用简单的redirect()
(来自 url 帮助程序)。但是,这不会提醒用户登录成功:它只是一个普通的重定向。
正确的方法是返回一个 json 文件,所以不要回显是或否,而是使用这个:
$response['type'] = 'error';
$response['msg'] = 'Login Succesful';
$response['redirect'] = 'http://your-url.com/controller/method';
echo json_encode($response);
die;
然后,您在 ajax 调用中处理答案,以及一些好的警报(在我的例子中,Sweet Alert)有点像这样:
success: function(data)
if (data.redirect)
swal(
title: '¡Success!',
text: data.msg,
timer: 2000,
type: data.type,
showConfirmButton: false
, function()
window.location.href = data.redirect;
);
else
swal('¡Error!', data.msg, data.type);
所以这段代码的作用是,如果你的 json 响应有一个重定向字段,会在一段时间后触发重定向。但是如果您的 json 响应没有字段重定向,则只会显示警报。
【讨论】:
【参考方案3】:检查您的返回数据类型。可能您可以在 Ajax 代码中的数据类型中使用。返回数据无法读取 if 条件。我面临同样的问题或使用这个
if($.trim(msg) == '是')
【讨论】:
【参考方案4】:将echo "Yes";
更改为die("Yes");
。这将确保在“是”或“否”之后不会发送任何内容,然后 JS 代码将按预期工作。
【讨论】:
【参考方案5】:它们也是成功后从控制器重定向的一种方式。 在这种情况下,您只需要按照这两个步骤进行重定向 控制器中的这一行,您可以在其中获得真实条件并希望重定向
if($result)
echo base_url()."welcome/";
else
echo 0;
在您应用 ajax 的 html 页面上,在真实情况下您尝试此重定向页面
success: function(result)
if(result!=0)
// On success redirect.
window.location.replace(result);
else
alert('wrong');
【讨论】:
以上是关于在codeigniter中如何使用ajax登录后重定向的主要内容,如果未能解决你的问题,请参考以下文章
如果会话超时,如何在 MVC 中的 jquery ajax 调用后重定向到新页面?