Backbone.js提交数据后无法跳转至CodeIgniter控制器求助
解决Backbone.js AJAX登录后CodeIgniter无法跳转的问题
你的问题核心在于AJAX请求的特性:Backbone的save()发起的是异步AJAX请求,后端的redirect()只会将跳转指令作为响应返回给AJAX,并不会触发浏览器自动跳转——浏览器仅会在普通同步请求(比如表单直接提交)时遵循redirect指令。
步骤1:修改CodeIgniter后端的loginUser方法
不再直接使用redirect(),而是返回JSON格式的响应,告知前端登录状态与跳转目标:
public function loginUser() { if ($this->input->server('REQUEST_METHOD') == 'POST') { $data = $this->decode_data($this->input->raw_input_stream); $username = $data['username']; $password = $data['password']; $this->load->model('UserModel'); if ($this->UserModel->authenticate($username, $password)) { $this->session->is_logged_in = true; $this->session->username = $username; // 返回登录成功的JSON响应 echo json_encode([ 'status' => 'success', 'redirect_url' => base_url('/Home/') ]); } else { $this->session->login_error = True; // 返回登录失败的JSON响应 echo json_encode([ 'status' => 'error', 'redirect_url' => base_url('/User/') ]); } exit; // 确保后续无多余输出,避免JSON解析失败 } }
注意:需确保已加载CodeIgniter的url助手,可在config/autoload.php中配置$autoload['helper'] = array('url');,保证base_url()能生成正确URL。
步骤2:修改Backbone前端的authenticate方法
在success回调中解析后端返回的JSON响应,根据状态执行页面跳转:
authenticate: function(event) { event.preventDefault(); // 阻止表单默认同步提交行为(若事件绑定在表单submit上) var usernameValue = $('#username').val(); var passwordValue = $('#password').val(); var c = new MyQuiz(); var userDetails = { 'username': usernameValue, 'password': passwordValue } c.save(userDetails, { type: 'POST', url: '/CW2/ASSWDCW2/cw2app/index.php/User/loginUser', dataType: 'json', // 指定接收JSON格式响应 success: function(model, response) { if (response.status === 'success') { // 跳转到后端指定的首页 window.location.href = response.redirect_url; } else { // 登录失败,跳回登录页或提示错误 window.location.href = response.redirect_url; // 也可直接提示:alert('登录失败,请检查用户名或密码'); } }, error: function(model, response) { alert('请求出错,请稍后重试'); } }).done(function(model, response) { console.log('请求完成'); }); }
内容的提问来源于stack exchange,提问作者Kavishka Rajapakshe
相关产品推荐
相关产品推荐

