revel框架中http请求必须严格经过预设过滤器链才能调用控制器方法;请求由http.handler启动goroutine,依次执行panicfilter、routerfilter(匹配路由或返回404)、paramsfilter、session/flashfilter,最后由actioninvoker反射调用控制器action并返回result。

Revel框架中,一个HTTP请求从抵达服务器到最终调用控制器方法,必须严格经过预设的过滤器链,任何跳过或顺序错乱都会导致路由失败或Action不执行。
请求进入HTTP Handler并启动goroutine
Revel暴露一个标准的http.Handler,每个请求由Go运行时自动分配独立goroutine处理,确保高并发下互不阻塞。这一步不可跳过,也无需手动干预——它由net/http底层保障。
过滤器链逐级执行
请求被封装为*revel.Controller实例后,开始按序穿过全局revel.Filters数组。默认链共10个过滤器,关键节点如下:
① 【PanicFilter】:最先执行,负责捕获后续任意过滤器或Action中发生的panic,防止进程崩溃;若此处未启用,panic将直接终止goroutine且无错误页面返回。
② RouterFilter:解析请求路径与HTTP方法,对照conf/routes文件匹配路由规则。例如GET /users/:id会映射到Users.Show;【若routes文件语法错误或路径不匹配,此处直接返回404,后续过滤器不再执行】。
③ ParamsFilter:提取URL路径参数(如:id)、查询字符串(?q=go)和表单数据(需已调用ParseForm),统一注入c.Params结构体。注意:PUT/POST的x-www-form-urlencoded内容不会自动解析,必须显式触发。
④ SessionFilter与FlashFilter:分别读取并解密session和flash cookie,为控制器提供状态上下文。若cookie签名失效,SessionFilter会新建空session,但不会报错中断流程。
⑤ ActionInvoker:链中最后一个过滤器,它根据RouterFilter确定的目标Action,反射调用对应控制器方法(如Users.Show())。调用前已完成所有前置准备——参数就绪、session可用、验证上下文已初始化。
控制器方法被调用并返回Result
Controller结构体必须嵌入*revel.Controller,且Action方法需满足三个条件:首字母大写、接收c *YourController参数、返回revel.Result。例如:
func (c AppController) Home() revel.Result { return c.Render() }
该方法执行完毕后,返回的revel.Result(如Render、Redirect、JSON)会被传递回过滤器链末端,由BeforeAfterFilter等收尾过滤器完成响应头设置、压缩、日志记录等操作,最终写入HTTP响应流。











