002thinkphp session判断
先来介绍下ThinkPHP获取URL的变量:
echo '网站根目录地址:'.__ROOT__.'<br/>';
echo '当前项目(入口文件)地址:'.__APP__.'<br/>';
echo '当前分组地址:'.__GROUP__.'<br/>';
echo '当前模块地址:'.__URL__.'<br/>';
echo '当前操作地址:'.__ACTION__.'<br/>';
echo '当前 URL 地址:'.__SELF__.'<br/>';
echo '当前操作名称:'.ACTION_NAME.'<br/>';
echo '当前项目目录:'.APP_PATH.'<br/>';
echo '当前项目名称:'.APP_NAME.'<br/>';
圈起的三个无法获取;
echo $_SERVER["REQUEST_SCHEME"].'://'.$_SERVER["SERVER_NAME"].':'.$_SERVER['SERVER_PORT'].$_SERVER["REQUEST_URI"];
结果(模板页):http://localhost:80/ackonphp/index/loginOut.html
结果(操作名全称):http://localhost:80/ackonphp/home/index/testconn
echo $_SERVER['HTTP_HOST'].'<br/>';
echo $_SERVER['SCRIPT_NAME'].'<br/>';
echo $_SERVER['PATH_INFO'].'<br/>';
echo $_SERVER['QUERY_STRING'].'<br/>';
echo $_SERVER['PHP_SELF'].'<br/>';
$_SERVER['QUERY_STRING']无效;
==================================
下面正式介绍ThinkPHP拦截器功能
class AdminController extends Controller { /** * 后台控制器初始化 */ public function _initialize(){ $this->isLogin(); } public function isLogin(){ /** *操作前进行拦截,session不存在则返回登录页 *在Common模块/Conf/config.php配置不拦截的内容 */ $array=C('LOGIN_CHECK');//不拦截的路径 $url=__ACTION__;//当前路径 if(!in_array($url, $array)){ if(!session('loginUser')){ $this->display('/login'); } } } public function _empty(){ try{ if(method_exists($this,"actions")){ //内容省略 }else{ throw new \Think\Exception("未定义动作类绑定"); } }catch(Exception $e){ send_http_status('404');//action不存在或动作类不合法,抛出404 } } }
LOGIN_CHECK在config.php中进行指定
//拦截器,不拦截操作 'LOGIN_CHECK'=>array( __ROOT__.'/Home/Index/login', __ROOT__.'/Home/Index/loginOut', ),
这样在每个方法前会自动去判断session,session不存在返回登录页;
问题来了,当空操作就会在页面返回登录页,后面继续执行 _empty()里的内容;
_empty()里的内容被追加在登录页;
且
http://localhost/ackonphp/home/index/testconn这个路径在拦截后进入登录页,但此路径的内容仍被执行,追加在登录页后;
自动执行session判断达不到相应
if(!session('loginUser')){
return;
}
来阻止程序继续执行;
问题在于一旦session不存在应该直接进入登录页,后续操作终止;
这是由于thinkphp处理机制的问题,那么只能选择手工调用判断session的方法了。