express框架怎么获取界面中已经存在session,在express中写接口但是把项目放到express里面调用不到

L_xy
  • 67

做一个网站,需要使用单点登录,前端是用vue-cli构建的,然后使用build打包项目后放到express里,通过express进行转发,但是因为单点登录成功直接就会跳到我的index.html里面,所以我不知道该怎么在express的路由里怎么获取到前端页面给我返回的token
express的目录结构:

clipboard.png
里面的index.html是vue打包的前端界面

整体的流程是访问网址的时候会走单点登录,验证通过会返回到login页面,然后重定向到index页面
vue-cli中index.html代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <script src="<%= BASE_URL %>oidc-client.js"></script>
    <script src="<%= BASE_URL %>login.js"></script>
    <!-- <script src="<%= BASE_URL %>test.js"></script> -->
    <title>岗位管理系统</title>
</head>

<body>
    <noscript>
      <strong>We're sorry but job-management doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <script>
    </script>
</body>

</html>

其中oidc-client.js是单点登录的公共js
login.js是配置单点登录的js

login.js中部分代码如下:


function log() {

    Array.prototype.forEach.call(arguments, function(msg) {
        if (msg instanceof Error) {
            msg = "Error: " + msg.message;
        } else if (typeof msg !== "string") {
            msg = JSON.stringify(msg, null, 2);
        }
        console.log(msg)
        
        //登录时通过接口形式把session传给express
        //var ajax = new XMLHttpRequest();
        //ajax.setRequestHeader("Content-type", "application/json");
        //ajax.open('post', '...');
        //ajax.send(msg)
        //console.log(ajax.status);
    });
}

var config = {
    //...
};
var mgr = new Oidc.UserManager(config);

mgr.getUser().then(function(user) {
    if (!user) {
        log("User not logged in");
        //没登录跳转到登录页
        mgr.signinRedirect();
    } else {
        log(user);
    }
});

//监听用户注销事件
mgr.events.addUserSignedOut(function() {
    console.log("user signed out");
    //清除token
    //...
    //跳转
    mgr.signoutRedirect();
});

mgr.events.addUserLoaded(function(user) {
    log(user);
});

function login() {
    mgr.signinRedirect();
}

function api() {
    //...
}

function logout() {
    mgr.signoutRedirect();
}

这种情况下,执行起来是通的,session信息会输出在控制台,并且在浏览器的session Storage中是有的,但是我不知道怎么在express中拿到:

clipboard.png

问了下后端的同事,他们说webserver一般都是通过在页面中发请求的方式接收传值的,我就在express的app.js中写了以下部分代码

app.post('/user/login', function(req, res) {
    res.status(200)
    res.json({ message: 'Token接收成功' })
    console.log(req)
})

在项目的login.js中的login方法中调用的代码如下:

function log() {

    Array.prototype.forEach.call(arguments, function(msg) {
        if (msg instanceof Error) {
            msg = "Error: " + msg.message;
        } else if (typeof msg !== "string") {
            msg = JSON.stringify(msg, null, 2);
        }
        console.log(msg)
        
        //登录时通过接口形式把session传给express
        var ajax = new XMLHttpRequest();
        ajax.setRequestHeader("Content-type", "application/json");
        ajax.open('post', '...');
        ajax.send(msg)
        console.log(ajax.status);
    });
}

但是这样以后运行,单点登录就走不通了,之前也没接触过多少express,中间的转发层更是第一次使用,想请各位熟悉express的大牛指点下错误,或者更好更合理的获取session Storage里面信息的方法,大谢大谢

回复
阅读 1.9k
2 个回答

1.可以尝试下express的插件 express-session
2.可以尝试下在express中使用jwt呢

  1. 可以把跟用户会话相关的session放到cookie里,比如token等,然后express的路由里就可以通过req.cookies.token拿到了
  2. 前端请求的时候把sessionStorage里express想获取的信息带上,放到http header里或者请求的body里都可以,比如req.header.token或者req.body.token
宣传栏