文档章节

使用Event组件如何设置前后过滤器

汤汤圆圆
 汤汤圆圆
发布于 2015/12/17 22:42
字数 626
阅读 43
收藏 0

可能我们在某些时候需要在某一个动作前后执行一些逻辑一个;我们可以通过事件机制来完成

##一个Token验证的例子

假如你开发了一个API;有的资源能对外开放;有的需要验证才能访问资源;这就需要我们对请求来判断是否访问了需要的资源;以及他们所携带的token是否正确

####使用kernel.controller事件来前置过滤器

定义一些对外的token参数;注意这些也可以在数据库中配置

# app/config/config.yml
parameters:
    tokens:
        client1: pass1
        client2: pass2

定义一个接口;以便区分哪些控制器需要验证

namespace AppBundle\Controller;

interface TokenAuthenticatedController
{
    // ...
}

定义控制器;实现了上述的接口的控制器就需要验证才能访问

namespace AppBundle\Controller;

use AppBundle\Controller\TokenAuthenticatedController;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class FooController extends Controller implements TokenAuthenticatedController
{
    // An action that needs authentication
    public function barAction()
    {
        // ...
    }
}

####创建一个事件监听者

// src/AppBundle/EventListener/TokenListener.php
namespace AppBundle\EventListener;

use AppBundle\Controller\TokenAuthenticatedController;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

class TokenListener
{
    private $tokens;

    public function __construct($tokens)
    {
        $this->tokens = $tokens;#构造注入
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();

        /*
         * $controller passed can be either a class or a Closure.
         * This is not usual in Symfony but it may happen.
         * If it is a class, it comes in array format
         */
        if (!is_array($controller)) {
            return;
        }

        //验证传入的token是否正确
        if ($controller[0] instanceof TokenAuthenticatedController) {
            $token = $event->getRequest()->query->get('token');
            if (!in_array($token, $this->tokens)) {
                throw new AccessDeniedHttpException('This action needs a valid token!');
            }
        }
    }
}

####注册监听者

# app/config/services.yml
services:
    app.tokens.action_listener:
        class: AppBundle\EventListener\TokenListener
        arguments: ['%tokens%']#把上面配置的tokens参数注入给监听者类
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

###使用kernel.response事件构造后置过滤器

假如我们上面的例子;客户token正确;访问资源完毕;我们需要回调给客户数据;客户那边也需要验证; 这时候我们就可以使用 该事件了;

//这是kernel.controller事件调用
public function onKernelController(FilterControllerEvent $event)
{
    // ...

    if ($controller[0] instanceof TokenAuthenticatedController) {
        $token = $event->getRequest()->query->get('token');
        if (!in_array($token, $this->tokens)) {
            throw new AccessDeniedHttpException('This action needs a valid token!');
        }

        //验证通过;标记一下回调的auth_token
        $event->getRequest()->attributes->set('auth_token', $token);
    }
}


//这个是 kernel.response事件分发时候调用的
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

public function onKernelResponse(FilterResponseEvent $event)
{
    //检查是否设置了auth_token
    if (!$token = $event->getRequest()->attributes->get('auth_token')) {
        return;
    }

    $response = $event->getResponse();

    // 创建一个response header放入加密信息;
    $hash = sha1($response->getContent().$token);
    $response->headers->set('X-CONTENT-HASH', $hash);
}

####注册监听者

# app/config/services.yml
services:
    app.tokens.action_listener:
        class: AppBundle\EventListener\TokenListener
        arguments: ['%tokens%']
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
            - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

© 著作权归作者所有

汤汤圆圆

汤汤圆圆

粉丝 11
博文 82
码字总数 26299
作品 0
昌平
程序员
私信 提问
事件Qevent的接受和忽略 和重定义 事件过滤器

事件处理流程: 某个事件发生------>exec()循环会接收到这个事件------> 创建一个事件对象,并将对象传递给QObject::event()------> 在QWidget::event()函数中,分配给特定的事件处理函数---...

晨曦之光
2012/04/13
170
0
QT事件过滤器

Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件。 让我们试着设想已经有了一个CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. ...

晨曦之光
2012/04/13
633
0
Qt5 与 Qt4 的点点差异------事件

Qt5相对于Qt4 增加对事件accept()和ignore()函数。 Qt 中有很多种事件:鼠标事件、键盘事件、大小改变的事件、位置移动的事件等等。对于事件的处理,我们Qt 中使用相对应的机制。 event()函数...

萨斯辈的呼唤
2014/01/16
5.6K
0
QT5: 事件过滤.

虽然可以用event拦截事件,但是有的时候我们的应用中用到了很多的组件,或者我们自己实现了一个组件继承了很多其他的组件,我们要想通过event拦截事件,就变得很困难了,必须重写所有的event...

SHIHUAMarryMe
2016/04/04
54
0
Vue.js基本语法的介绍

介绍 前段时间接触到一个库叫做Vue.js, 个人感觉很棒,所以整理了一篇博文做个介绍。 Vue读音/vju:/,和view类似。是一个数据驱动的web界面库。Vue.js只聚焦于视图层,可以很容易的和其他库整...

chenhao_ch
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

thinkphp5.1学习过程四——trait

<?php /** *trait实现了代码的复用 *并且突破了单继承的限制 *trait是类不是类,不能实例化 */ trait Demo1 { public function hello1() { return __METHOD__; } } trait Demo2 { public fu......

大海yht
30分钟前
6
0
DB2 sequence 操作

操作DB2 下 sequence seqName db2数据库一般seq还是比较大的,但是程序在调用的时候还是不可避免的有一些bug, 下面是对于seq一些简单的操作,也作为工作的一些记录 1、命令行取sequence se...

飞雪无痕
38分钟前
6
0
《吊打面试官》系列-秒杀系统设计

你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 絮叨 之前写了很多Redis相关的知识...

敖丙
44分钟前
12
0
Qt编写气体安全管理系统11-数据打印

一、前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可...

飞扬青云
50分钟前
5
0
初级阶段

#include <stdio.h> #include <stdlib.h> int main(){ int a; int Sn = 0; int i; int tmp = 0; scanf_s("%d", &a); for (i = 1; i <= 5; i++) { tmp = tmp * 10 + a; Sn += tmp; } printf("......

Lxxxxx256
51分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部