Laravel5.1学习笔记3 HTTP中间件
2015-06-29 07:08
756 查看
HTTP 中间件
简介建立中间件
注册中间件
可终止中间件
简介
HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。当然,除了身份验证之外,中间件也可以被用来执行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的响应头,一个日志中间件可以记录所有传入应用程序的请求。
Laravel 框架已经内置一些中间件,包括维护、身份验证、CSRF 保护,等等。所有的中间件都位于
app/Http/Middleware目录内。
定义中间件
要建立一个新的中间件,可以使用make:middleware这个 Artisan 命令:
[code]php artisan make:middleware OldMiddleware
[/code]
此命令将会 在
app/Http/Middleware目录内置立一个名称为
OldMiddleware的类。在这个中间件内我们只允许
年龄大于 200 的才能访问路由,否则,我们会将用户重新导向 「home」 的 URI 。
[code]<?php namespace App\Http\Middleware; use Closure; class OldMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->input('age') < 200) { return redirect('home'); } return $next($request); } } ?>
[/code]
如你所见,若是
年龄小于
200,中间件将会返回 HTTP 重定向给客户端,否则,请求将会进一步传递到应用程序。只需调用带有
$request的
$next方法,即可将请求传递到更深层的应用程序(允许跳过中间件) HTTP 请求在实际碰触到应用程序之前,最好是可以层层通过许多中间件,每一层都可以对请求进行检查,甚至是完全拒绝请求。
Before / After 中间件
在一个请求前还是请求后指定某个中间件取决于这个中间件里面是怎么实现的。这个中间件可以执行在请求前执行一些前置 操作:[code]<?php namespace App\Http\Middleware; use Closure; class BeforeMiddleware { public function handle($request, Closure $next) { // Perform action return $next($request); } }
[/code]
然后,这个中间件也可以在请求后执行一些 后置 操作:
[code]<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware { public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } }
[/code]
#注册中间件
全局中间件
若是希望中间件被所有的 HTTP 请求给执行,只要将中间件的类加入到
app/Http/Kernel.php的
$middleware属性清单列表中。
指派中间件给路由
如果你要指派中间件给特定的路由,你得先将中间件在
app/Http/Kernel.php配置一个键值,默认情况下,这个文件内的
$routeMiddleware属性已包含了 Laravel 目前配置的中间件,你只需要在清单列表中加上一组自定义的键值即可。
[code]// Within App\Http\Kernel Class... protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ];
中间件一旦在 HTTP kernel.php 文件内被定义,你即可在路由选项内使用
middleware键值来指派:
[/code]
Route::get('admin/profile', ['middleware' => 'auth', function() { // }]);
#中间件参数
中间件也可以接收额外的参数, 例如, 如果你的应用需要验证用户在执行某个动作之前具有指定的“角色”,你可以创建一个 RoleMiddleware 接受角色名字作为额外参数。<?php namespace App\Http\Middleware; use Closure; class RoleMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); } } ?>
中间件参数可以在定义路由的时候指定,用冒号把middleware 名字和值分开,多个参数用都好隔开。
[code]Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) { // }]);
[/code]
#可终止中间件
有些时候中间件需要在 HTTP 响应已被发送到用户端之后才执行,例如,Laravel 内置的 「session」 中间件,保存 session 数据是在响应已被发送到用户端 之后 才执行。为了做到这一点,你需要定义中间件为「可终止的」。(这里5.0和5.1文档不同,可能不需要在继承TerminableMiddleware接口)[code]<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
[/code]
Terminate方法接收request和response对象, 一旦定义了 terminable 中间件,你需要将它增加到 HTTP kernel 文件的全局中间件清单列表中。
相关文章推荐
- Java SE 6 新特性: HTTP 增强
- JAVA Socket通信中自定义TCP通信协议
- 浅析http协议、cookies和session机制、浏览器缓存
- 信息与网络安全需要大数据安全分析
- 黑马程序员——Java中网络编程笔记
- 国家能源局:《电力企业网络与信息安全专项监管报告》
- 国家能源局:《电力企业网络与信息安全专项监管报告》
- Node.js学习-----------搭建一个简单的HTTP服务器
- RabbitMQ安全相关的网络资源介绍
- [网络流]hdu3046(Dinic)
- 转发——java基础:父类与子类之间变量和方法的调用 http://blog.csdn.net/xxqi1229/article/details/6905530
- Java aio(异步网络IO)初探
- android请求https(一)生成BKS
- Novel 网络小说点评
- iOS网络编程
- 《TCP/IP入门经典》——网络访问层
- 利用HTTP Cache来优化网站
- 两种unix网络编程线程池的设计方法
- HTTP总结
- 编写网络程序