HTTP请求中的Angular2 Set-Cookie JSESSIONID

时间:2016-11-15 08:25:50

标签: javascript java angular cookies jsessionid

我使用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));

2 个答案:

答案 0 :(得分:9)

这是好的做法吗?

不,这不是好习惯。

来自JWT文档:

  

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

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

<强> JSESSIONID

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

<强>接头

  

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

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

myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');

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

答案 1 :(得分:0)

Easiest Solution

constructor(public restProvider: RestProvider) { }
    intercept(request: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
        if (this.restProvider.getToken() != null) {
            const clonedRequest = request.clone({
                headers: request.headers.set('X-Requested-With', 'XMLHttpRequest')
            });
        }
    }