我正在使用 Go session 管理:
"github.com/gorilla/sessions"
以下代码的问题在于,与 CookieStore 关联的 session 未在处理程序之间共享,我需要它这样做。
处理程序 "/authorize" 将值保存到 session 中,然后重定向到另一个处理程序 "/thankyou",但该处理程序在 session 中看不到该值.
我已验证 session 在原始处理程序 "/authorize" 中确实具有新值。
import (
"github.com/gorilla/sessions"
)
var (
cookieStore *sessions.CookieStore
storeGUID string
sessionGUID string
)
func init() {
storeGUID = "{random-string}"
sessionGUID = "{random-string}"
cookieStore = sessions.NewCookieStore([]byte(storeGUID))
}
mux.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
var sess *sessions.Session
sess, err := cookieStore.Get(r, sessionGUID)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
sess.Values["authMode"] = "Authorized"
if err := sess.Save(r, w); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// Redirect to "/thankyou"
authorizeURL := r.URL.String()
thankyouRedirectURL := strings.Replace(authorizeURL, "authorize", "thankyou", 1)
defer http.Redirect(w, r, thankyouRedirectURL, http.StatusFound)
}
mux.HandleFunc("/thankyou", func(w http.ResponseWriter, r *http.Request) {
var sess *sessions.Session
sess, err := cookieStore.Get(r, sessionGUID)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
var sval interface{}
var authMode string
sval = sess.Values["authMode"]
if authMode, ok := sval.(string); !ok {
err := errors.New("Missing \"authSess\" in session.")
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
最佳答案
我的网络服务器遇到了同样的问题。我正在做你在这里做的事情:
sval = sess.Values["authMode"]
if authMode, ok := sval.(string); !ok {
err := errors.New("Missing \"authSess\" in session.")
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
我创建了一个局部变量以存储检索到的 session 值,然后键入断言该值以确保其完整性。我发现类型断言悄无声息地失败了,因为 gorilla/sessions.Session 结构的 Values 字段是类型 map[interface{}]interface{} ( source )。从 Values 字段中检索 session 值时,就像您在此处所做的那样...
sval = sess.Values["authMode"]
...编译器认为 sval 现在是 interface{} 类型。因此,当您尝试键入 assert sval 时,它无法将接口(interface)转换为字符串。
我所做的是在我处理类型断言的 if block 上方创建一个变量声明,以便我以后可以使用它。然后,我使用 map 元素本身键入断言。这就是您的样子:
var authMode string // a var declaration with the type you want
var ok bool // in my case, I also created a bool var to avoid a pointer error
// directly type assert the session value
if authMode, ok = sess.Values["authMode"].(string); !ok {
err := errors.New("Missing \"authSess\" in session.")
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
希望对您有所帮助!
关于session - gorilla / session : Session be managed (persist changes) between handlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765891/
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL
我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种
我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi
当使用rubyselenium驱动程序驱动chrome时,我得到/home/travis/.rvm/gems/ruby-2.6.2/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/remote/response.rb:72:in`assert_ok':sessionnot创建:Chrome版本必须在70和73之间(Selenium::WebDriver::Error::SessionNotCreatedError)如何解决这个问题?降级chrome不是我想做的事。 最佳答案
我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=
我在使用session变量时遇到问题。我有两个名为“graduate_students_controller”和“current_students_controller”的Controller。这些Controller中的每一个都控制不同的View文件。我在这两个Controller中使用session变量来存储session信息。问题来了。假设我有两个View文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件都由上述Controller单独控制。现在,如果我尝试从同一浏览器中打开这两个网页并尝
这是一个长期存在的挫败感来源,但也许我遗漏了什么。如果我正在调试,并且我想退出调试器并返回到IRB或Rails控制台,“退出”将不起作用,因为它将退出IRB。“完成”似乎也与继续具有相同的效果。使用“删除”删除断点然后尝试“继续”或“完成”不起作用。有什么想法吗? 最佳答案 至少在byebug中,你可以这样做:evalreturn它具有计算当前函数的return语句的净效果。这有时会奏效,具体取决于调用堆栈的外观。现在虽然这不会删除当前断点....如果您只是想收回控制权,在大多数情况下这会做到这一点,具体取决于您的代码结构。在您的代
默认情况下,session存储在浏览器cookie(:cookie_store)中,但您也可以指定其他包含的存储之一(:active_record_store、:mem_cache_store或您自己的自定义类。请提供我构建自定义类的方式config.action_controller.session_store=:your_customer_class 最佳答案 MaurícioLinhares是正确的,但是,我想添加一些细节,因为我认为您需要实现哪些方法并不明显。你可以继承自ActionDispatch::Session::Ab