Skip to main content

中间件

Axtix Web 的中间件系统允许我们为请求/响应处理添加额外的行为。中间件可以嵌入到请求的处理中,使我们能够修改请求以及停止请求处理以提前返回响应。

中间件也可以嵌入到响应处理中。

通常,中间件涉及以下操作:

  • 预处理请求(Pre-process)
  • 后处理响应(Post-process)
  • 修改应用状态
  • 访问外部服务(redis、日志、sessions)

中间件被注册在每个 Appscope,或 Resource,并会按照注册顺序的相反顺序执行。一般来说,中间件 是实现了 Service 特质Transform 特质 的类型。特质中的每个方法都有一个默认实现。每个方法都可以立即返回结果或一个 future 对象。

下面的演示中创建了一个简单的中间件:


另外,对于简单的使用,你可以使用 wrap_fn 创建小型的临时中间件:


Actix Web 提供了一些有用的中间件,例如 logginguser sessionscompress 等。

提醒:如果多次使用 wrap()wrap_fn(),最后一次出现的内容将被优先执行。

日志

日志作为中间件实现。通常将日志中间件注册为应用的第一个中间件。每个应用都必须注册日志中间件。

Logger 中间件使用标准的日志库记录信息。要查看访问日志,应启用 actix_web 包的日志配置(env_logger 或类似)。

使用

使用指定的 format 创建 Logger 中间件。可使用 default 方法创建默认的 Logger 中间件,它使用默认的格式:

  %a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %T

以下是默认日志格式的示例:

INFO:actix_web::middleware::logger: 127.0.0.1:59934 [02/Dec/2017:00:21:43 -0800] "GET / HTTP/1.1" 302 0 "-" "curl/7.54.0" 0.000397
INFO:actix_web::middleware::logger: 127.0.0.1:59947 [02/Dec/2017:00:22:40 -0800] "GET /index.html HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0" 0.000646

格式化

  • %% 百分号
  • %a 远程 IP 地址(使用反向代理时的代理 IP 地址)
  • %t 请求开始处理的时间
  • %P 处理请求的进程ID
  • %r 请求报文的第一行
  • %s 响应状态码
  • %b 响应内容的字节数(bytes),包括 HTTP 头部
  • %T 处理请求消耗的时间,以秒为单位,按照 .06f 的格式表示
  • %D Time taken to serve the request, in milliseconds
  • %{FOO}i 请求头 'FOO' 的值
  • %{FOO}o 响应头 'FOO' 的值
  • %{FOO}e 系统环境变量 'FOO' 的值(os.environ['FOO']

默认的头部信息

要想设置默认的响应头,可以使用 DefaultHeaders 中间件。如果响应头中已经包含了指定的 header,DefaultHeaders 中间件不会覆盖这个 header 的值。


用户会话(sessions)

Actix Web 提供了会话管理的通用解决方案。actix-session 中间件可以使用多种方式来存储会话数据。

默认情况下,只实现了 cookie 会话后端。也可以添加其他实现。

CookieSession 使用 cookies 存储 session。CookieSessionBackend 创建的会话只能存储少于 4000 字节的数据,因为数据需要容纳到一个单独的 cookie 中。如果会话数据超过 4000 字节,将会产生内部服务器错误。

cookie 的安全策略可以是 signedprivate。每种策略都有一个相应的 CookieSession 构造函数。

客户端可以查看但不能修改安全策略为 signed 的 cookie。客户端既不能查看也不能修改安全策略为 private 的 cookie。

构造函数需要提供一个 key 作为参数。这是 cookie 会话的私钥 - 当这个值被修改时,所有的会话数据都会丢失。

一般来说,你需要创建一个 SessionStorage 中间件,并用特定的实现(如 CookieSession)对其进行初始化。必须使用 [Session][requestession] 提取器访问会话数据。该方法返回一个 Session对象,允许我们获取或设置会话数据。

要使用actix_session::Session,需要指定 crate feature "cookie-session"。


错误处理

ErrorHandlers 中间件允许我们为响应提供自定义的处理。

你可以使用 ErrorHandlers::handler() 方法为特定的状态码注册自定义的错误处理。在这个错误处理中你可以修改现有的响应或创建一个全新的响应。错误处理程序可以立即返回响应,也可以返回一个 future。