[英]How to manage cookies - with JavaScript or with HTTP Set-Cookie?
[英]How to set cookies with no expiration date and how to set custom cookie headers?
默認情況下,cookie在會話結束時過期,因此用戶每次關閉瀏覽器后都需要登錄。 但是, remember
選項-如何設置沒有有效期限的cookie? 我嘗試在development.ini文件中添加session.cookie_expires = False
,但這沒有幫助。
另一個問題:如何設置自定義Cookie標頭(例如,將lang
為沒有到期日期的主cookie)?
編輯:
我發現max_age
在parametr pyramid.authentication.AuthTktAuthenticationPolicy ,它可以讓您保存會話之間的cookie。 但是,當max_age
在__init__.py
max_age
(config)文件中定義它並remember me
必須在登錄視圖中定義時,如何實現“ remember me
復選框?
“記住我”背后的想法是,它是在登錄和會話之間持續存在的一個選項。 最好將其實現為單獨的cookie,如果用戶選中該框,則可以設置該cookie。 如果“記住我”表示該策略已過期,則應用程序應重新登錄,然后僅存儲一個永不過期的簽名cookie。 然后,當由於用戶未登錄而使應用程序引發HTTPForbidden
時,您可以檢查cookie,查看它們是否想被記住,將其重新登錄,然后將其重定向回嘗試訪問的位置。 那只是一個選擇,取決於您“記住我”的意思。
如果您正在使用UnencryptedCookieSessionFactoryConfig
會話工廠,則需要為cookie_max_age
參數傳遞適當的值。 還檢查timeout參數,它是存儲在cookie中的簽名時間戳。 結合max_age,會話的實際到期時間將是max_age和timeout的最小值。
要設置自定義Cookie,您只需使用所需的參數調用response.set_cookie()
。 如果使用渲染器,則可以訪問通過request.response
使用的響應對象。 否則,如果您自己手動創建響應對象,則在此處進行設置。
這不是正確的方法,但是可以。
def login_user(request, usesr_id, time=None):
"""
@type request: pyramid.request.Request
@type usesr_id: int
@type time: int
@rtype: Response
"""
request.session["user_id"] = usesr_id
if time is not None:
request.session._sess.cookie_expires = datetime.timedelta(seconds=time)
request.session._sess._set_cookie_expires(None)
else:
request.session._sess.cookie_expires = True
request.session._sess._set_cookie_expires(None)
request.session._update_cookie_out()
request.session.save()
我一直在尋找類似的解決方案。 我正在使用bottle-cork.py進行用戶身份驗證,並且需要一種方式為用戶提供“讓我保持登錄狀態”選項
from bottle, import request, response # etc...
def post_get(name, default=''):
return bottle.request.POST.get(name, default).strip()
def login():
"""Authenticate users"""
username = post_get('username').lower()
password = post_get('password')
keep_login = post_get('keep_login')
session = request.environ['beaker.session']
if keep_login == 'true':
session.cookie_expires = False
response.set_cookie('keep_login', "true")
else:
session.cookie_expires = True
response.set_cookie('keep_login', "false")
aaa.login(username, password)
但是,每次將請求發送到服務器時,Bottle都會返回一個新的會話cookie,默認情況下,該cookie將在瀏覽器關閉時到期。 為了解決這個問題,我添加了一個在每次發送請求時調用的函數:
def preserve_cookie(request):
keep_login = request.get_cookie('keep_login')
session = request.environ['beaker.session']
if keep_login == 'true':
session.cookie_expires = False
return request
因此,例如:
@bottle.get('/get_username')
def check_login(user=None):
try:
aaa.require(username=user)
except:
raise bottle.HTTPError(401)
preserve_cookie(request)
return aaa.current_user.username
這樣,返回的新cookie保持了用戶保留登錄會話保存的首選項。 但是,當前實現beaker.SessionMiddleware的方式只是將Cookie設置為在2038年1月18日到期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.