前后端分离,使用nodejs做为JAVA和前端的中间层,session维护的问题
发布于 9 年前 作者 langlang1234 31030 次浏览 最后一次编辑是 8 年前 来自 问答

大家好,我现在项目准备采用nodejs+expressjs + java, 也就是说,后台不动,前端从jsp脱离,使用nodejs来开发

但是现在有个棘手的问题,就是关于java的jsessionid维护的问题

我们知道,通常把html和java部署在一个war包下,那么浏览器用ajax调用后台的话,是不存在跨域的问题,当然也不存在会话保存的问题,jsessionid被保存在cookie里

现在我封装了一个nodejs的服务,使用http模板,用来请求后台,那么问题来了,登录后,后台返回的cookie里的jsessionid,不会被自动保存起来(不像浏览器里,会自动把jsessionid保存在cookie里)

也就是说,我使用http调用了login接口,下次再调用别的list接口时,还是会报401的问题

那么这种(NODE调用java,JAVA后台鉴权的情况)是如何解决呢?

这个大家伙有没有什么经验可以传授的?

P.S:也许有人不赞同我现在的架构,不过现在暂时不讨论这种前后端分离的做法好不好。

21 回复

接口用session作鉴权?好吧。意思是node.js用来模拟登录后进行一系列的调用api吗?调用完了就可以抛弃登录状态?若是如此的话,看下request库,有cookie jaw功能,可以维护cookie状态

来自酷炫的 CNodeMD

我们用token 每次带token请求

可以在url参数里带上jsessionid

关注这个。 这种情况下,node只是html渲染的,其他都应该是透传的。 也就是说,java返回的cookie你得写回到浏览器的cookie,然后请求java的时候带上。 程序自己维护cookie,很累工作量很大

回楼上,我是使用的hbs(handlebars的服务器),在node侧请求java,然后绑定数据到模板,最后发给浏览器,浏览器拿到手的就是一个完整的html,无需再次请求java的数据了

所以,维护会话的责任只能落在node侧了,因为浏览器只是请求node的url,本身不会发送ajax到java

@ldcsirtest2012 请教一下,这个token是什么技术?

是java那边也要同步配合支持吧? 能不能再稍微详细点讲解一下,谢谢了

在node里做session,node和java之间就不用session了,直接服务之间鉴权就好了

@JacksonTian node里是有session的,用来保存每个用户的jsessionid,然后node请求java时,要带上这个jsessionid的 否则后台怎么知道是哪个用户在请求呢?

具体看哪种适合你,1.node维护session,node和java是内网访问,java服务外网不可访问,这样调用java接口直接带上用户id直接操作。2.node端不维护session,java维护session并提供token,node只要带着token即可确定哪个用户,token时效性机制可以根据业务来定

既然都前后端分离了,还要session干什么?你的java api不是无状态的吗?

跟前后端分离有半毛钱关系? 麻烦将标题前半段,前后端分离去掉. 直接提问session的保持问题或者服务器端用户数据共享的问题就行了. 标准的参考一下oauth, 想简单处理的话就在URL上带个SESSIONID就可以了. 看来在错误的前后端分离概念引导下导致一堆人进入了困境. 更是出现了奇葩的架构.

类似的项目我们团队是这么处理的, session 交由 nodejs 层打理, 用户session过期了nodejs层就能处理掉,用的express-session和connect-redis这两个中间件。nodejs 访问 java api 通过 token 授权,nodejs 在请求 java api 的时候在请求头里的Authorization字段带上token。

@MouCai 感谢楼上 就是说要在node里保存每一个用户的token,这样后台才知道是哪个用户请求的

@langlang1234 我们是吧 token 保存在 node 层的 session 里, session 保存在 redis 里。

其实,直接转发 cookie 不是最简单的做法吗?但是这样一来, node.js 这个中间层存在的意义是什么呢?与直接调用 java api 相比有什么优势吗?

楼上的说到我的痛处了,这样做的好处是什么呢?

node.js是不是负责渲染html?输出静态页面不对外暴露API?若是这种情况,建议直接 转发 cookie,说到底那只是一个 header。

mark一下 我也觉得java应该是无状态的服务端接口,要想知道是哪个用户那就传userid啊

怎么实现的啊~哥

@leyou319 自己也可以回复自己么

回到顶部