Remix.run使用remix-auth重定向时如何更新Cookie会话数据
你用createCookieSessionStorage存储会话时,所有会话数据的修改都必须重新序列化签名后,通过Set-Cookie响应头返回给浏览器才会生效,直接返回裸的redirect响应不会触发会话更新,按以下步骤改就行:
- 先引入你初始化
createCookieSessionStorage时导出的getSession、commitSession方法,这两个方法是读写会话的核心 - 在处理跳转的loader(或action)逻辑里,不要直接返回redirect,先从请求头里取出当前会话对象
- 调用session的set方法修改
firstVisit字段为true - 调用
commitSession生成更新后的cookie字符串,把它挂到redirect响应的Set-Cookie头里再返回
对应实现代码:
// 先从你自己写的session配置文件里导入这两个方法 // import { getSession, commitSession } from '~/services/session.server' export async function loader({ request }) { // 读取当前请求携带的会话 const session = await getSession(request.headers.get('Cookie')) // 更新会话内的字段值 session.set('firstVisit', true) // 跳转时携带更新后的会话cookie return redirect('/pageLocation', { headers: { 'Set-Cookie': await commitSession(session) } }) }
注意事项
- 如果你是在
remix-auth的FormStrategy校验回调、或者successRedirect逻辑里改会话值,逻辑完全一致:必须把更新后的session commit后挂到跳转响应头,否则修改不会生效。Cookie 会话的所有数据都存在客户端浏览器的cookie里,没有服务端侧的存储,不返回新的Set-Cookie头浏览器就不会更新本地存的会话值。 - 不要在响应返回之后再修改session,所有字段更新逻辑必须放在构造redirect响应之前完成。
内容的提问来源于stack exchange,提问作者canaryGrapher
相关产品推荐
相关产品推荐

