Vapor 大型教程
中间件
中间件位于请求和响应之间,适合放认证、日志、跨域和错误处理。这里先看 Vapor 3 的内置中间件,再说明它们的执行顺序。
一、什么是中间件
中间件位于客户端请求与服务端响应之间,可以完成一些诸如:请求日志记录、捕获错误并展示相关信息、限制访问量等功能。
在 Vapor 中使用最频繁的就是 ErrorMiddleware 了,它能够把同步和异步的请求错误转换成 HTTP 响应。意外的错误会使服务器立即断开与客户端的连接并打印出内部错误日志;使用了 ErrorMiddleware 可以确保抛出的所有错误都被转换成合适的 HTTP 响应。
生产环境注意:在生产环境下,
ErrorMiddleware 会把所有的错误都转换成 500(服务器内部错误)响应,这在一定程度上也保证了应用的安全——因为错误信息中往往包含数据库结构、文件路径等敏感信息,做了这层转换就可以保护这些敏感信息不被泄露出去。FileMiddleware 是另外一个中间件,它会对 Public 目录下的文件进行文件服务,在写前端页面时可以提供对 js、css、html 等静态文件的服务。
SessionMiddleware 会话中间件用来跟踪客户端连接的整个会话过程。
对于大型 Web 应用,中间件是很重要的基础设施。
二、常用的内置中间件
除了上面提到的 ErrorMiddleware,Vapor 还自带了几个开箱即用的中间件,它们各司其职:
| 中间件 | 作用 |
|---|---|
ErrorMiddleware | 把请求错误统一转换成 HTTP 响应,避免服务器直接断连,并在生产环境隐藏敏感信息。 |
FileMiddleware | 对 Public 目录下的文件提供文件服务,用于托管 js、css、html 等前端静态资源。 |
SessionMiddleware | 会话中间件,用来跟踪客户端连接的整个会话过程,是 Cookie 与 Session 功能的基础。 |
后面在「Cookie 与 Session」与「提供文件下载」两篇文章里,你会看到 SessionMiddleware 与 FileMiddleware 的具体配置代码与用法。
中间件的顺序与自定义
中间件不是无序的装饰器,而是一条请求流水线。通常先放错误处理,再放日志、会话和权限检查,最后才进入路由处理器。顺序错误会导致未登录请求绕过鉴权,或异常没有被统一转换成响应。
var middlewares = MiddlewareConfig()
middlewares.use(ErrorMiddleware.self)
middlewares.use(SessionMiddleware.self)
middlewares.use(AuthMiddleware.self)
services.register(middlewares)
自定义中间件应保持单一职责,并明确它修改的是请求还是响应。日志里不要记录密码、Cookie 和完整令牌;需要排查问题时使用请求 ID 关联前后端日志即可。