php登陆项目,ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)

一、定义中间件

namespace app\middleware;

class Check

{

public function handle($request, \Closure $next)

{

if ($request->param('name') == 'think') {

return redirect('index/think');

}

return $next($request);

}

}

中间件类可以随意命名,中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。

二、前置/后置中间件

中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。

下面是一个前置行为的中间件:

namespace app\middleware;

class Before

{

public function handle($request, \Closure $next)

{

// 添加中间件执行代码

return $next($request);

}

}

下面是一个后置行为的中间件:

namespace app\middleware;

class After

{

public function handle($request, \Closure $next)

{

$response = $next($request);

// 添加中间件执行代码

return $response;

}

}

三、注册中间件

新版的中间件分为全局中间件、应用中间件(多应用模式下有效)、路由中间件以及控制器中间件四个组。执行顺序分别为:

全局中间件->应用中间件->路由中间件->控制器中间件

1. 全局中间件

全局中间件在app目录下面middleware.php文件中定义,使用下面的方式:

return [

\app\middleware\Auth::class

];

中间件的注册应该使用完整的类名,如果已经定义了中间件别名(或者分组)则可以直接使用。全局中间件的执行顺序就是定义顺序。

2. 应用中间件

如果你使用了多应用模式,则支持应用中间件定义,你可以直接在应用目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该应用下面生效。

3. 路由中间件

最常用的中间件注册方式是注册路由中间件:

Route::rule('hello/:name','hello')->middleware(\app\middleware\Auth::class);

支持注册多个中间件:

Route::rule('hello/:name','hello')->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);

4. 控制器中间件

支持为控制器定义中间件,只需要在控制器中定义middleware属性,例如:

namespace app\controller;

class Index

{

protected $middleware = ['auth'];

public function index()

{

return 'index';

}

public function hello()

{

return 'hello';

}

}

当执行index控制器的时候就会调用auth中间件,一样支持使用完整的命名空间定义。

5. 内置中间件

中间件类

描述

think\middleware\AllowCrossDomain

跨域请求支持

think\middleware\CheckRequestCache

请求缓存

think\middleware\LoadLangPack

多语言加载

think\middleware\SessionInit Session

初始化

think\middleware\FormTokenCheck

表单令牌

这些内置中间件默认都没有定义,你可以在应用的middleware.php文件中、路由或者控制器中定义这些中间件,如果不需要使用的话,取消定义即可。

四、中间件使用 – 后台登录页面跳转流程

8da4a09668ce21376291a2f22b3927da.png

当访问后台主页的时候,如果已经登录(已记录session)则可以进入注意,否则返回登录页面;若访问后台登录页面,如果已经登录(已记录session)则直接跳转到主页,否则进入登录页面。

1. 创建Auth中间件

在admin应用文件夹创建middleware文件夹,创建Auth.php中间件文件:

namespace app\admin\middleware;

use think\Response;

class Auth

{

public function handle($request, \Closure $next){

// 前置中间件

if(empty(session(config("admin.session_admin"))) && !preg_match("/login/",$request->pathinfo()) ){

return redirect(url('login/index'));

}

if(!empty(session(config("admin.session_admin"))) && preg_match("/login\/index/",$request->pathinfo())){

return redirect(url('index/index'));

}

$response = $next($request);

// 后置中间件

return $response;

}

public function end(Response $response){

}

}

admin.session_admin是在admin/config文件夹下配置文件定义的:

admin/config/admin.php

return [

'session_admin' => 'adminUser'

];

2. 注册应用中间件

在admin应用目录新建middleware.php:

return [

\think\middleware\SessionInit::class,

app\admin\middleware\Auth::class

];

本文同步分享在 博客“zy1281539626”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第七届决赛之---阶乘位数

阶乘位数9的阶乘等于:362880它的二进制表示为:1011000100110000000这个数字共有19位。请你计算,9999 的阶乘的二进制表示一共有多少位? 思路总结: 根据平时做题规律得到如下规律:public class SwingDesign …

生日快乐模板php,可会有人跟我说句生日快乐

一个人一年可以经历三百六十五次零点的跨越,可是真正有意义的却只有那么一次。从呱呱坠地到现在芳华正茂,今晚将是我要度过的第二十二个零点。从此以后,我便会进入到一个崭新的年龄,弱弱的问一句:可会有人跟我说句生日…

Java排序算法之--快速算法--快速上手

何为快速算法:它是冒泡排序的改进~ 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以…

排序算法值--堆排序

堆实际上是一棵完全二叉树&#xff0c;其任何一非叶节点满足性质&#xff1a;Key[i]<key[2i1]&&Key[i]<key[2i2]或者Key[i]>Key[2i1]&&key>key[2i2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆&#x…

linux 彻底删除oracle,Linux下完美卸载Oracle

先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Oracle时出现一个错误&#xff0c;倒致oracle没有安先说一下Linux 下Oracle没有卸载干净再安装会出现什么后果吧&#xff0c;在一次生产环境安装中&#xff0c;装Orac…

spring常见术语理解

SpringMVC工作流程&#xff1a;流程 1、用户发送请求至前端控制器DispatcherServlet 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 …

linux ssh服务,Linux配置SSH服务以便实现远程连接

Linux用户们一定想要知道该怎么开启SSH服务吧&#xff0c;SSH服务是Linux系统远程连接的重要方式&#xff0c;所以如何配置SHH服务也让很多用户感到纠结。现在小编就帮大家解决这个问题。配置方法&#xff1a;查询\安装SSH服务1.登陆linux系统&#xff0c;打开终端命令。输入 r…

玄学········为什么在eclipse上更改程序之后运行之后好像没更改一样

更改了半天&#xff0c;保存的了很多次&#xff0c;错误也改掉了&#xff0c;但是还是报同一个错误&#xff0c;很痛苦~搜了半天&#xff0c;终于搞定了&#xff0c;方法总结如下&#xff1a;一 可能是有一些文件没报存&#xff0c;设置让其自动保存&#xff1a;1 Windows-&g…

转圈打印矩阵~~

下面附上程序&#xff0c;欢迎各位前来讨论&#xff1a; package jian_zhi_offer;public class code29_PrintMatrixClockWisely {public static void main(String args[]) {int arr[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };printMatrix(arr);}/* 这个函数…

“之”字形打印矩阵~

编程如下&#xff1a; 欢迎大家前来讨论~ public class PrintMatirx { public static void main(String args[]) { int arr[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; printZigMatrix(arr); } public static void printZigMatrix(int arr[][]) { int row1 …

linux设备probe,你了解Embeded linux中的probe

一、基于linux-3.18.20、mac驱动二、启动时机&#xff1a;所谓的"probe”&#xff0c;是指在Linux内核中&#xff0c;如果存在相同名称的device和device_driver&#xff0c;内核就会执行device_driver中的probe回调函数&#xff0c;而该函数就是所有driver的入口&#xff…

在行列都排好序的矩阵中找数

对于这种题&#xff0c;首先要读懂该题的题意&#xff0c;首先是有序的&#xff0c;然后就判断K是否存在数组中。 仔细研究这个题之后不难发现一个规律&#xff0c;咱们定义右上角的坐标为&#xff08;row&#xff0c;col&#xff09;则有如下规律&#xff1a;程序如下&#xf…

打印两个有序链表的公共部分~~

类似与归并排序&#xff0c;这里就不再赘述了~

透彻理解回文~单链表的逆序~

判断一个单链表是不是回文&#xff0c;主要有三种方法&#xff0c;不过如果要考虑空间复杂度的话&#xff0c;就只有常用的一种方法了。 这种方法很考验一个人的细心以及编程能力~ 前两种方法比较简单我就不祥述了~ 主要讲一下最后一种方法&#xff1a;直接上图了~下面附上code…

linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...

Nand Flash 是一个存储芯片。本文引用地址&#xff1a;http://www.eepw.com.cn/article/201801/374606.htm那么&#xff1a;这样的操作很理“读地址A的数据&#xff0c;把数据B写到地址A”问1&#xff1a;原理图上的Nand Flash和SC2440之间只有数据线&#xff0c;怎么传输地址?…

将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺

这道题一开始想到的方法可能就是patition方法了&#xff0c;大概思路我说一下&#xff0c;先把这个链表存为数组&#xff08;说明其空间复杂度为0&#xff08;1&#xff09;&#xff09;&#xff0c;然后在对这个数组进行patition&#xff0c;即定义两个指针&#xff0c;一个指…

复制含有随机指针节点的链表~哈希表的使用~(⌒▽⌒)

题目意思就是说给你给head 的Node节点&#xff08;这是一个比较特殊的链表&#xff09;&#xff0c;来拷贝出它地结构出来。 方法一&#xff1a;借助HashMap的特性&#xff0c;定义一个HashMap<Node,Node> map对象&#xff0c;key和value都是value类型 &#xff0c;key来…

两个单链表相交的一系列问题----0_0

这道题emmm&#xff0c;难度相对来说很大额。 主要是要分成三种情况来考虑&#xff1a; 1. 两个链表都无环&#xff1b; 2. 两个链表都有环&#xff1b; 3. 一个有环一个无环&#xff0c;这种情况是不用 考虑的&#xff0c;一定没有交点&#xff08;姥姥记住&#xff1a;单链表…

排序系列之---冒泡排序

排序系列之---冒泡排序 -。-冒泡排序的基本思想就是把数组中值最大的元素放到数组的右边&#xff0c;一个一个放。 比如数组&#xff1a;3&#xff0c;4&#xff0c;2&#xff0c;7&#xff0c;5&#xff0c;1&#xff0c;9&#xff0c;0 首先它从该数组中找到值最大的数…

排序算法之——选择排序

排序算法之——选择排序选择排序&#xff0c;工作原理很简单&#xff0c;顾名思义&#xff0c;就是每一次从待排序的数据元素中选出最小的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。选择排序是不稳定的排序方法&#xff08;比如序列…