最近在学习在用thinkphp框架写后台,然后想实现自动拦截所有的前台请求,然后判断前台请求是否符合条件,不符合条件的拦截下来返回错误数据,符合条件的自动放行。
当然,你可以在每个请求中判断一个,但是这样的方式是不是太笨重了呢,代码冗长而且不方便管理。 通过查阅了很多资料并经过本人亲测有两个非常有效的方法和大家分享:
首先,要实现全局拦截,顾名思义,肯定是有一个公共类文件,然后其他类文件都继承这个类文件,而要保证每次请求进入当前类文件的时候都要调用同一个方法才行,这里有一个非常重要的函数_initialize()(初始化函数),每次请求进来时都会调用这个函数;当然还有一个函数__construct()(构造函数),这个函数是指在对象初始化的时候才会被调用。这里我们用的是_initialize();
- 创建公共类文件Common.php
<?phpnamespace app\blog\controller;use think\Controller;use app\common\lib\Aes;use think\Session;/** 2. 校验请求是否合法 3.*/class Common extends Controller{/** * 初始化函数 * * @return void */public function _initialize(){ /** * 每次请求过来都会执行的方法 */$this->checkSignAuth();}/** *检查header中的sign是否合法 * * @return void */public function checkSignAuth(){}}
然后确保创建的其他类文件都继承该文件即可。
2.具体拦截过滤的代码写在checkSignAuth即可,这里有两个方法实现:
(一)this->error(msg=’’,msg=’’, msg=’’,url=null,data,data, data,wait=3);
该方法是‘操作错误跳转的快捷方法’:会带有返回码code:0,返回码不能自己修改(只能修改源码实现,慎重);如上所示:
$msg:提示信息;
$url:跳转的地址
$data:返回的数据
$wait:等待时间
作为前后端分离的项目其实url,url, url,wait是不需要的,具体用法:
public function checkSignAuth(){$headers = request()->header();if (!isset($_SESSION['uid'])) {$this->error('登录超时,请重新登录');}}
返回数据格式:
(二)this−>redirect(this->redirect( this−>redirect(url);
该方法是:‘路由重定向’;返回数据可以自己随意定义
$url:需要重定向的路由路径,该路由是从application下的第一个文件夹开始
用法:
首先创建Error.php文件(名字随便取)
在Error.php中创建方法(名字随便取)然后返回数据即可
class Error extends Controller{public function NoToken(){return rjson(0, 'no token', '0');//rjson()是我自定义返回数据的方法,这里使用thinkphp自带的即可} }
注意:Error.php 中集成的是Controller或者不用继承关系也可!!
Common.php用法:
public function checkSignAuth(){$headers = request()->header();if (!isset($_SESSION['uid'])) {$this->redirect('blog/error/NoToken');}}
返回数据:
这样,返回结果都放到Error.php 处理即可
防止路径出错分享一下重定向具体路径:
NOToken是Error.php中的方法
PS:想要了解更具体的用法可以 ‘Ctrl+手表左键’跳转到具体的方法中查看哦