Revel 支持兩種 基于 cookie 存儲機制
~~~
// 一個簽名 cookie (不超過4kb).
// 限制: Keys may not have a colon in them.
type Session map[string]string
// 在每個請求中,Flash 獲取并重寫cookie。
// 它允許數據每次跨越存儲到一個頁面。It allows data to be stored across one page at a time.
// 它通常用來實現成功或錯誤消息。
// 比如: Post/Redirect/Get : http://en.wikipedia.org/wiki/Post/Redirect/Get
type Flash struct {
Data, Out map[string]string
}
~~~
## Session
Revel的 “session” 是一個加密簽名存儲的字符串 map。
影響如下:
* 大小不超過 4kb。
* 所有數據被保存為一個序列化的字符串。
* 用戶可以查看、修改所有數據 (未加密)。
session cookie 的默認過期時間是瀏覽器關閉。 可以在app.config修改session.expires配置來指定一個有效期時間。格式是[time.ParseDuration](http://golang.org/pkg/time/#ParseDuration).
## Flash
Flash 支持單獨使用字符串存儲。這對于實現?[Post/Redirect/Get 模式](http://en.wikipedia.org/wiki/Post/Redirect/Get)是很有用的, 或臨時顯示 “操作成功!” 或 “操作失敗!” 消息。
下面是一個例子:
~~~
// 一個設置頁面
func (c App) ShowSettings() revel.Result {
return c.Render()
}
// 處理頁面提交數據
func (c App) SaveSettings(setting string) revel.Result {
// 驗證用戶輸入
c.Validation.Required(setting)
if c.Validation.HasErrors() {
// 設置被帶回的flash cookie錯誤信息
c.Flash.Error("Settings invalid!")
// 在flash cookie中保存驗證錯誤
c.Validation.Keep()
// 復制所有給定的參數(URL, Form, Multipart)到flash cookie
c.FlashParams()
return c.Redirect(App.ShowSettings)
}
saveSetting(setting)
// 設置flash cookie成功消息
c.Flash.Success("Settings saved!")
return c.Redirect(App.ShowSettings)
}
~~~
例子主要功能如下:
1. 用戶獲取設置頁面。
2. 用戶提交一個表單 (POST)。
3. 應用程序處理用戶請求,保存錯誤或成功的消息到flash中,然后重定向設置頁面 (REDIRECT)。
4. 用戶獲取設置頁面, 顯示flash中的消息。 (GET)
主要使用了兩個函數:
1. `Flash.Success(message string)`?是?`Flash.Out["success"] = message`簡寫方式
2. `Flash.Error(message string)`?是?`Flash.Out["error"] = message`簡寫方式
在模板中使用key來獲取Flash 消息。例如, 通過簡寫函數獲取成功和錯誤消息:
~~~
{{.flash.success}}
{{.flash.error}}
~~~