簡體   English   中英

如何設置沒有有效期限的Cookie,以及如何設置自定義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的最小值。

http://docs.pylonsproject.org/projects/pyramid/zh-CN/1.3-branch/api/session.html#pyramid.session.UnencryptedCookieSessionFactoryConfig

創建自定義Cookie

要設置自定義Cookie,您只需使用所需的參數調用response.set_cookie() 如果使用渲染器,則可以訪問通過request.response使用的響應對象。 否則,如果您自己手動創建響應對象,則在此處進行設置。

http://docs.pylonsproject.org/projects/pyramid/zh-CN/1.3-branch/api/response.html#pyramid.response.Response.set_cookie

這不是正確的方法,但是可以。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM