刷新页面时会话丢失(下一步,反应,同构)

时间:2017-08-26 10:13:01

标签: javascript reactjs fetch isomorphic-javascript nextjs

我正在使用zeit来制作一个带有react的同构应用程序和一个带有express-session(在其他服务器中)的express用于制作API。

此组件应该从API请求私有数据(request.get('http://0.0.0.0:3100/private'))并在用户登录时显示私人页面,否则重定向到登录。

在客户端这可行,但是当我刷新私有页面时,我被重定向到登录,因为客户端和服务器端的会话cookie是不同的。 ¿我该如何解决这个问题?

%=

2 个答案:

答案 0 :(得分:2)

@PacoRampus as @neerajdngl说在刷新页面时,你的cookie被传递到快速服务器而不是浏览器。所以,您被重定向到登录页面。

您可以这样做:

app.UseStaticFiles();
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");      
});

并且您的server.js文件应该是这样的代码:

    Private.getInitialProps = async ({ req, res }) => {
        let Cookie;
        if (req) {
            Cookie = encodeURIComponent(req.cookies.your_token_name);
        } else {
            Cookie = '';
        }

        let yourCookie= 'token=' + Cookie;

       const response = await fetch('http://someDomain/private', {
            credentials: 'include',
            headers: {Cookie: yourCookie}
        }));

        let body;
        if (response.status !== 401) {
            body = await response.json();
        } else {
            if (res) {
                res.writeHead(302, { Location: '/login' })
                res.end()
            } else {
                Router.push('/login')
            }
        }

        return {}
    }

希望这适合你。

答案 1 :(得分:1)

当您刷新页面时,cookie将被传递到快速服务器,而不是api。您需要在快递中获取cookie,然后将cookie与api请求一起传递。

当您从客户端发出api请求时,cookie将自动与请求一起传递,该请求将验证您的api呼叫。

您需要执行以下代码段中的操作。我正在使用 fetch 而不是 request

getCookies = encodeURIComponent(req.cookies.token);
const sendCookie = 'token=' + getCookies;
const response = await fetch(YOUR_API_ENDPOINT, {
            credentials: 'include',
            headers: {Cookie: sendCookie}
        })