项目环境
我前端框架用的是Angular 1.5.8,Nodejs + express。后台用的是Tomcat,提供接口。
所有通讯都是通过get、post请求的方式。
问题
遇到的很大的一个坑:如何判断用户是否登录?
解决方法
有两种方式判断用户是否登录:
一、设置请求的cookie里面的JSESSIONID
二、跟后台沟通好,设置一个token,每次请求都发送token
我们项目的流程是先登录。首先发送个get请求获取验证码,这时候后台返回一个JsessionId,然后我的每次get、post请求都需要在cookie里面加上JsessionId。
先贴张直接访问Tomcat服务器验证码接口的get请求的图:

在Request Headers里面的cookie : JSESSIONID 这个就是后台返回的。询问了一下后台人员,jsessionid这是请求成功后Tomcat自动加的。
下面问题来了,如何拿到JSESSIONID,然后重新组装cookie给后台发回去呢?
我没用中间件来实现,直接用的原生http模块,下面上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| //路由文件 login.js router.get('/securitycode1', function(req, res, next) { var options = { hostname: global._hostname, // 主机名 path: global._path+'login/securitycode1', //访问的路径 method: 'GET', }; var results = '';
var reqq = http.request(options, function(ress) { ress.on('data', function (chunk) { results = results + chunk; }); ress.on('end', function () { global.jsessionid = ress.headers['set-cookie'][0].match(/JSESSIONID=(\S*);/)[1]; //通过ress的头部拿到JSESSIONID这行字符串,用正则匹配出来 存到global里面。 console.log("JSESSIONID: "+global.jsessionid);
res.send(results);//把Tomcat发送的请求转发回客户端(即Angular) }); });
reqq.on('error', function(e) { //TODO }); reqq.end(function(){
}); });
|
现在,nodejs所有页面都可以用JSESSIONID了,使用方法:global.jsessionid。
举个使用的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| //路由文件 login.js router.post('/' , function(req , res , next){ var data = require('querystring').stringify(req.body);//这是post方法提交的数据(form表单序列化) var options = { hostname: global._hostname, path: global._path+'login', method: 'POST', headers: {'Cookie': 'JSESSIONID='+global.jsessionid ,"Content-Type": 'application/x-www-form-urlencoded', "Content-Length": data.length } //通过headers Cookie直接设置JSESSIONID }; console.log(options); var results = '';
var reqq = http.request(options, function(ress) { ress.on('data', function (chunk) { results = results + chunk; }); ress.on('end', function () { res.send(results);//把Tomcat发送的请求转发回客户端(即Angular) }); });
reqq.on('error', function(e) { }); reqq.write(data); //把数据写到请求里面 reqq.end(function(){ });
});
|
这样所有的请求就都有了JSESSIONID,登陆后就可以访问其他的Tomcat接口了。
好像express-http-proxy这个express中间件也可以实现,但是没细研究。
前后端分离还在摸索中,最近得好好拜读一下老外的文章了。
尾巴
推荐两篇文章(得翻墙):
Cookies vs Tokens. Getting auth right with Angular.JS
The Ins and Outs of Token Based Authentication
这两篇都是讲的前后端分离,很有启发意义。