在不重新加载或额外请求的情况下,访问客户端上的服务器会话信息。

8

我使用express.session进行服务器端认证。正常情况下,将会话信息传递到客户端的方式是重新生成由服务器端生成的新 HTML 并重新渲染页面,但这需要重新加载。

我的应用为单页应用程序,希望避免重新加载。有没有一种方法可以在客户端访问与连接用户相关的信息?这些信息是否存储在 cookie 中?如何在不重新加载页面或发出额外的服务器请求的情况下访问它们?


2
在Express中创建一个路由,返回一些用户会话数据的JSON格式,并在客户端使用Ajax请求获取它。 - stagas
当你说“一个页面应用程序”时,你是真的指的两个页面,即登录页面和应用程序页面吗?还是一个页面包含登录表单和应用程序两者? - Stobor
@Stobor:就是这个问题。我想将登录页面与其他页面合并,并根据 express.session 显示其中一个。 - Randomblue
如果用户未登录,则显示登录页面 - 当他们填写完毕后,您会向服务器发出请求吗? - Stobor
@Stobor:是的,当他们填写完毕后,我会向服务器发送请求。 - Randomblue
2个回答

5
这样做的唯一方法要么是在初始服务器响应中包含信息(例如嵌入HTML中的动态生成的JS对象),要么就像alessioalex建议的那样,发出第二个请求来获取信息。
不能在与服务器通信的情况下从服务器获取信息...

是的,我对可以填充初始服务器响应的方法很感兴趣。我想保持页面的静态服务(即不使用像Jade这样的花哨东西)。我在考虑使用cookies... - Randomblue
如果您想在JavaScript对象中提供动态内容,那么您将被迫使用像jade这样的工具来填充它。我猜在cookie中设置信息是可能的,然后在客户端访问它们(我相信是document.cookie),但是如果数据有任何安全性,我不建议这样做。您无法确定用户系统如何处理/存储/处理cookie。如果您确实以这种方式执行此操作,则不应在服务器端信任cookie中的信息。用户可以更改cookie信息,并且不应将其复制回会话中。 - Nick Mitchinson
如果你想要设置cookies,你可以尝试使用https://github.com/jed/cookies。我没有使用过它(在express本身中可能有更简单的方法),但是我现在没有时间去检查。 - Nick Mitchinson

4
如@stagas所建议的那样,您可以使用Express创建自定义路由,例如/user,并使用JSON返回会话数据(用户详细信息)。这样一来,您就不需要刷新页面了。
示例:
app.get('/user', function (req, res) {
  res.json(req.session.user);
});

你可以使用一个cookie中间件来存储用户信息,但我不建议仅依靠它来检查用户是否已登录。因为cookie并不是最安全的方式,所以如果你真的不想向服务器发送额外的请求,只需在其中存储非关键信息(例如性别、年龄等)。 - alessioalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接