Laravel自定义登录会话校验:解决ERR_TOO_MANY_REDIRECTS错误
解决Laravel控制器过滤器导致的ERR_TOO_MANY_REDIRECTS问题
这个错误的根源很清晰:你的beforeFilter没有排除登录页面对应的控制器方法,触发了无限重定向循环。
为什么会出现循环?
当用户没有telecall_id会话时,过滤器会把他重定向到登录页;但登录页的方法同样属于TelecallController,会被这个过滤器再次拦截——此时用户还没完成登录,自然没有telecall_id,于是又被重定向回去,反复循环直到浏览器报错。
修复步骤
你只需要把登录相关的控制器方法加入到except数组中,让过滤器跳过对登录请求的检查:
- 先确认你登录页对应的方法名称(比如你可能定义了
login、getLogin或者showLoginForm这类方法); - 修改
beforeFilter的except参数,把这个方法名加进去。
修改后的代码示例:
<?php class TelecallController extends BaseController { public function __construct() { $this->beforeFilter(function () { if(!Session::has('telecall_id')) { return Redirect::to('/8032/telecalls/login'); } }, array('except' => array('login'))); // 替换成你实际的登录方法名 } // 示例登录方法(根据你的实际代码调整) public function login() { // 处理登录提交逻辑 if(Request::isMethod('post')) { $credentials = Input::only('username', 'password'); // 这里是你的自定义登录验证逻辑 if(/* 验证通过 */) { Session::put('telecall_id', $validatedUserId); return Redirect::to('/8032/telecalls/your-target-page'); } return Redirect::back()->withErrors('登录失败'); } // 显示登录表单 return View::make('telecall.login'); } // 其他需要验证的方法 public function dashboard() { return View::make('telecall.dashboard'); } }
额外注意事项
- 确保
except数组里的方法名和你实际定义的完全一致,如果是RESTful风格的方法(比如getLogin处理GET请求、postLogin处理POST请求),要把这两个都加进去:array('except' => array('getLogin', 'postLogin')); - 登录成功后一定要确认
Session::put('telecall_id', ...)确实执行了,否则用户登录后还是会被过滤器拦截。
内容的提问来源于stack exchange,提问作者Namratha Sri
相关产品推荐
相关产品推荐

