前后端分离,使用nodejs做为JAVA和前端的中间层,session维护的问题
 发布于 9 年前  作者 langlang1234  32292 次预览  最后一次回复是 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 回复
klesh

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

来自酷炫的 CNodeMD

ldcsirtest2012

我们用token 每次带token请求

yakczh

可以在url参数里带上jsessionid

chemdemo

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

langlang1234

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

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

langlang1234

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

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

JacksonTian

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

langlang1234

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

9958

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

guanpu

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

calidion

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

MouCai

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

langlang1234

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

MouCai

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

klesh

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

langlang1234

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

klesh

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

xupeng086

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

whishtlee

怎么实现的啊~哥

leyou319

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