HTTP 请求中的 Angular2 Set-Cookie JSESSIONID
Angular2 Set-Cookie JSESSIONID in HTTP requests
我正在使用 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));
这是好的做法吗?
不,这不是好的做法。
来自 JWT 文档:
In authentication, when the user successfully logs in using their credentials, a JSON Web Token will be returned and must be saved locally (typically in local storage, but cookies can be also used), instead of the traditional approach of creating a session in the server and returning a cookie.
参考:https://jwt.io/introduction/https://jwt.io/introduction/
JSESSIONID
您需要知道浏览器中存储了多种类型的cookie。其中许多可以从 JS 代码访问,但其中一些是 httpOnly
。这意味着浏览器能够在每个请求中将它们透明地附加到 JS 代码(您不会在代码中看到 cookie)。服务器端 JSESSIONID
的默认实现是 httpOnly
cookie 的示例。这种设计有多种安全原因 - 您页面上的 JS 恶意软件将无法从客户端窃取 session。
Headers
myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');
这不是将 cookie 传递到服务器的有效方法。这是向客户端发送响应并在客户端上设置 cookie 的正确方法。如果你想传递cookies,你可以使用:
myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');
不过,这行不通。无论如何,浏览器都会附加自己的。
也就是说,JSESSIONID
应该由浏览器 自动 附加到您的请求中。如果这不起作用,则 JSESSIONID
cookie 未在浏览器中设置(检查 chrome 开发人员工具,您可以在应用程序选项卡中查看 cookie)或者您正在使用远程服务器 - 在不同的 port/server/protocol 比你的应用程序要多(在这种情况下,CORS 会进来并破坏你的应用程序)。
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')
});
}
}
我正在使用 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));
这是好的做法吗?
不,这不是好的做法。
来自 JWT 文档:
In authentication, when the user successfully logs in using their credentials, a JSON Web Token will be returned and must be saved locally (typically in local storage, but cookies can be also used), instead of the traditional approach of creating a session in the server and returning a cookie.
参考:https://jwt.io/introduction/https://jwt.io/introduction/
JSESSIONID
您需要知道浏览器中存储了多种类型的cookie。其中许多可以从 JS 代码访问,但其中一些是 httpOnly
。这意味着浏览器能够在每个请求中将它们透明地附加到 JS 代码(您不会在代码中看到 cookie)。服务器端 JSESSIONID
的默认实现是 httpOnly
cookie 的示例。这种设计有多种安全原因 - 您页面上的 JS 恶意软件将无法从客户端窃取 session。
Headers
myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');
这不是将 cookie 传递到服务器的有效方法。这是向客户端发送响应并在客户端上设置 cookie 的正确方法。如果你想传递cookies,你可以使用:
myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');
不过,这行不通。无论如何,浏览器都会附加自己的。
也就是说,JSESSIONID
应该由浏览器 自动 附加到您的请求中。如果这不起作用,则 JSESSIONID
cookie 未在浏览器中设置(检查 chrome 开发人员工具,您可以在应用程序选项卡中查看 cookie)或者您正在使用远程服务器 - 在不同的 port/server/protocol 比你的应用程序要多(在这种情况下,CORS 会进来并破坏你的应用程序)。
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')
});
}
}