cookie管理(3) 应用
来源:互联网 发布:淘宝客怎么看 编辑:程序博客网 时间:2024/06/03 16:34
// +build ignorepackage mainimport ( "fmt" "html/template" "log" "net/http" "os" "path" "sync" "time" "xapp/components/httpmod/http" "xapp/components/httpmod/http/session" "xapp/components/httpmod/http/session/memory" "xapp/kore" utils "xapp/utils")var ( globalSessions *session.Manager)func getPagePath(name string) string { xappPath := os.Getenv("XAPP") return path.Join(xappPath, "components", "httpmod", "http", "ejemplo", name)}func init() { var err error memoryprovider.DoRegister() globalSessions, err = session.NewManager("memory", "gosessionid", 60*1000) globalSessions.DoStartGC() if err != nil { panic(err) } log.Println("global sessions is initialized")}func getString(session session.Session, key interface{}) string { rv := session.Get(key) if rv != nil { switch rv.(type) { case string: return rv.(string) } } return ""}func getBool(session session.Session, key interface{}, defVal bool) bool { rv := session.Get(key) if rv != nil { switch rv.(type) { case bool: return rv.(bool) } } return defVal}func doLogin(writer http.ResponseWriter, req *http.Request) { log.Printf("Login<%s>: Method = %s", req.URL.Path[1:], req.Method) sess := globalSessions.SessionStart(writer, req) req.ParseForm() log.Printf("Forms: %s", req.Form) // a proper map switch req.Method { case "GET": t, _ := template.ParseFiles(getPagePath("login.gtpl")) writer.Header().Set("Content-Type", "text/html") t.Execute(writer, nil) case "POST": if req.FormValue("username") == "cartman" && req.FormValue("password") == "poder" { sess.Set("login", true) sess.Set("tunombre", req.FormValue("username")) //http.Redirect(writer, req, "/logon", http.StatusFound) //break writer.Header().Set("Content-Type", "text/plain") fmt.Fprintf(writer, "logon") log.Printf("session-id:(logged in): %v", sess.SessionID()) } else { // log.Println("try redirect") // http.Redirect(writer, req, "/countnow", http.StatusFound) writer.Header().Set("Content-Type", "text/plain") fmt.Fprintf(writer, "failed") } }}func genDoShutdown(doClose func()) func(writer http.ResponseWriter, req *http.Request) { return func(writer http.ResponseWriter, req *http.Request) { sess := globalSessions.SessionStart(writer, req) log.Printf("shutdown: %v", sess.SessionID()) if getBool(sess, "login", false) { time.AfterFunc(0, doClose) writer.Header().Set("Content-Type", "text/plain") fmt.Fprintf(writer, "ok") return } writer.Header().Set("Content-Type", "text/plain") fmt.Fprintf(writer, "permission denied") }}func doLogon(w http.ResponseWriter, req *http.Request) { t, e1 := template.ParseFiles(getPagePath("logon.gtpl")) if e1 != nil { panic(e1) } type Info struct { Username string LoggedIn bool } sess := globalSessions.SessionStart(w, req) guessedName := getString(sess, "tunombre") log.Printf("Logon: welcome to <%v>", guessedName) t.Execute(w, &Info{ Username: getString(sess, "tunombre"), LoggedIn: getBool(sess, "login", false), })}func doCount(w http.ResponseWriter, r *http.Request) { sess := globalSessions.SessionStart(w, r) createtime := sess.Get("createtime") if createtime == nil { sess.Set("createtime", time.Now().Unix()) } else if (createtime.(int64)*1000 + 1000) < time.Now().Unix()*1000 { log.Println("createtime to !") globalSessions.SessionDestroy(w, r) sess = globalSessions.SessionStart(w, r) } ct := sess.Get("countnum") //log.Println("now count is:", ct) if ct == nil { sess.Set("countnum", 1) } else { sess.Set("countnum", (ct.(int) + 1)) } t, _ := template.ParseFiles(getPagePath("count.gtpl")) w.Header().Set("Content-Type", "text/html") type Info struct { Count int } t.Execute(w, &Info{ Count: sess.Get("countnum").(int), })}type runNow struct { wg *sync.WaitGroup closeSig chan bool}func newRunNow(wg *sync.WaitGroup) *runNow { return &runNow{ wg: wg, closeSig: make(chan bool), }}func (r *runNow) StartServ() { r.wg.Add(1) go func() { defer r.wg.Done() tick := time.Tick(2 * time.Second) A100: for { select { case <-r.closeSig: log.Print("Stopped by user") break A100 case <-tick: //log.Print("tick tac toc") break } } log.Print("leaving run-now") }()}func (r *runNow) StopServ() { r.closeSig <- true}func main() { var wg sync.WaitGroup man := kore.NewKMan() shutSig := make(chan bool, 1) sb := utils.MakeSysTouchExtra(shutSig) serverM := httpmodule.NewHttpSvrMod(10011, "TestSvr", &wg) mux := serverM.GetMux() //log.Printf("mux is %v", mux) mux.HandleFunc("/login", doLogin) mux.HandleFunc("/shutdown", genDoShutdown(func() { shutSig <- true })) //mux.HandleFunc("/countnow", doCount) //mux.HandleFunc("/logon", doLogon) //mux.HandleFunc("/loginnow", login) // It will trigger exception man.AddMod(serverM) man.AddMod(newRunNow(&wg)) man.Start() sb.Wait() man.Stop() wg.Wait() log.Println("end of test")}
阅读全文
0 0
- cookie管理(3) 应用
- 会话管理之Cookie技术应用
- 【Js应用实例】javascript管理cookie
- cookie管理
- Cookie管理
- cookie应用
- cookie应用
- httpclient4.3对cookie的管理
- asp.net的cookie应用3
- codeigniter 管理cookie创建cookie修改cookie删除cookie
- 插件69:管理cookie
- 会话 (cookie)管理
- 会话管理 Cookie
- Cookie会话管理
- Cookie会话管理
- 会话管理COOKIE
- Phalcon Cookie管理
- struts 管理cookie
- Python socket知识点总结
- Centos7 安装redis服务
- poj1284(欧拉函数、原根)
- 将日期进行加减运算
- 分布式事务方案:最大努力通知方案
- cookie管理(3) 应用
- AC自动机
- maven深入理解(一)
- 能不能自己写个类叫java.lang.System?
- link和@import的区别
- Codeforces 343D
- K-means聚类算法
- 给多说评论系统增加颜文字
- 版本更新