HTTP请求中的Angular2 Set-Cookie JSESSIONID

fag*_*a85 3 javascript java cookies jsessionid angular

我正在使用auth0/angular2-jwt库在每个请求上附加JWT.

我想知道如何在每个请求上添加JSESSIONID cookie,以便进入服务器端会话?

这是一个好习惯吗?

我试过这个没有成功

let myHeader = new Headers();
myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');

this.authHttp.get(endpoint, {headers: myHeader, withCredentials: true}).map(res => res.json()).subscribe(
  jwt => {
    ...
  },err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

rze*_*lek 9

这是好习惯吗?

不,这不是好习惯.

来自JWT文档:

在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌并且必须在本地保存(通常在本地存储中,但也可以使用cookie),而不是在传统方法中创建会话.服务器并返回一个cookie.

参考:https://jwt.io/introduction/https://jwt.io/introduction/

JSESSIONID

您需要知道浏览器中存储了多种类型的Cookie.其中许多都可以从JS代码访问,但其中一些是httpOnly.这意味着浏览器能够在JS代码上透明地附加每个请求(您不会在代码中看到cookie).JSESSIONID服务器端的默认实现是httpOnlycookie 的示例.这种设计存在多种安全原因 - 页面上的JS恶意软件将无法从客户端窃取会话.

myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');

这不是将cookie传递给服务器的有效方法.这是向客户端发送响应并在客户端上设置cookie的正确方法.如果要传递cookie,可以使用:

myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');
Run Code Online (Sandbox Code Playgroud)

不过,这不起作用.浏览器无论如何都会附加自己的.那个说法JSESSIONID应该由浏览器自动附加到您的请求中.如果这不起作用,JSESSIONID则不在浏览器中设置cookie(检查chrome开发人员工具,您可以在应用程序选项卡中查看cookie),或者您使用的是远程服务器 - 在不同的端口/服务器/协议上(而不是您的应用程序)在这种情况下,CORS进入并破坏了您的应用程序).