Comment autoriser le serveur express de noeud à accepter les cookies de Spring – Angular 4

J’ai une application Angular 4 avec un rendu côté serveur. Je veux exécuter une requête de repos côté serveur. J’ai donc écrit interceptor, cette requête d’interception et la création d’un cookie. Cela fonctionne, sur le contrôleur Spring que j’ai vu, que les cookies arrivent, mais si je mets le cookie en réponse, ils n’arrivent pas sur le serveur de noeud express, et par conséquent, ils ne viennent pas sur le navigateur.

serveur.ts

import 'zone.js/dist/zone-node'; import 'reflect-metadata'; import { renderModuleFactory } from '@angular/platform-server'; import { enableProdMode } from '@angular/core'; import * as express from 'express'; import { join } from 'path'; import { readFileSync } from 'fs'; import * as xhr2 from 'xhr2'; import * as bodyParser from 'body-parser'; import * as cookieParser from 'cookie-parser'; // Faster server renders w/ Prod mode (dev mode never needed) enableProdMode(); xhr2.prototype._ressortingctedHeaders = {}; // Express server const app = express(); const PORT = process.env.PORT || 4000; const DIST_FOLDER = join(process.cwd(), 'dist'); // Our index.html we'll use as our template const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toSsortingng(); // * NOTE :: leave this as require() since this file is built Dynamically from webpack const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.bundle'); // Express Engine import { ngExpressEngine } from '@nguniversal/express-engine'; // Import module map for lazy loading import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader'; app.use(bodyParser.json()); app.use(cookieParser()); // Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine) app.engine('html', ngExpressEngine({ bootstrap: AppServerModuleNgFactory, providers: [ provideModuleMap(LAZY_MODULE_MAP) ] })); app.set('view engine', 'html'); app.set('views', join(DIST_FOLDER, 'browser')); /* - Example Express Rest API endpoints - app.get('/api/**', (req, res) => { }); */ // Server static files from /browser app.get('*.*', express.static(join(DIST_FOLDER, 'browser'), { maxAge: '1y' })); // ALl regular routes use the Universal engine app.get('*', (req, res) => { res.render('index', { req: req, res: res, providers: [ { provide: 'REQUEST', useValue: (req) }, { provide: 'RESPONSE', useValue: (res) } ] }); }); // Start up the Node server app.listen(PORT, () => { console.log(`Node Express server listening on http://localhost:${PORT}`); }); 

server.interceptor.ts

 import {Inject, Injectable, Injector, PLATFORM_ID} from "@angular/core"; import {isPlatformBrowser} from "@angular/common"; import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from "@angular/common/http"; import {Observable} from "rxjs/Observable"; import "rxjs/add/operator/do"; import "rxjs/add/operator/mergeMap"; import "rxjs/add/observable/fromPromise"; import * as express from "express"; @Injectable() export class ServerInterceptor implements HttpInterceptor { constructor(@Inject(PLATFORM_ID) private platformId: ssortingng, private injector: Injector) { } intercept(request: HttpRequest, next: HttpHandler): Observable<HttpEvent> { request = request.clone({withCredentials: true}); if (!isPlatformBrowser(this.platformId)) { let req: express.Request = this.injector.get('REQUEST'); let rootDomain = req.hostname.split('.').slice(-2).join('.'); if (request.url.match(/^https?:\/\/([^/:]+)/)[1].endsWith(rootDomain)) { let cookieSsortingng = Object.keys(req.cookies).reduce((accumulator, cookieName) => { accumulator += cookieName + '=' + req.cookies[cookieName] + ';'; return accumulator; }, ''); request = request.clone({ headers: request.headers.set('Cookie', cookieSsortingng) }); } } return next.handle(request).do((event: HttpEvent) => { if (event instanceof HttpResponse) { console.log("event = " + JSON.ssortingngify(event)); // there I must to intercept response from spring with cookies, but there is no here, why?? let res: express.Response = this.injector.get('RESPONSE'); } }); } } 

Dans la console, mon événement ressemble à ceci: event = {“en-têtes”: {“normalizedNames”: {}, “lazyUpdate”: null}, “status”: 200, “statusText”: “OK”, “url”: ” http : // localhost: 9090 / test “,” ok “: true,” type “: 4,” body “: {” titre “:” “,” contenu “:” “}}. Où se trouve mon cookie (“test”, “test”)? Pourquoi ne viennent-ils pas sur le serveur de noeud?

app.component.ts

 export class AppComponent implements OnInit{ constructor(private http: HttpClient, @Inject(PLATFORM_ID) private platformId: Object){ } ngOnInit(): void { if (isPlatformServer(this.platformId)) { /* Server only code. */ this.http.get('http://localhost:9090/test').subscribe(data => { console.log("Init test") }); } } } 

Ceci est mon contrôleur de spring:

 @CrossOrigin(origins = "http://localhost:4000") @RequestMapping(value = "/test", method = RequestMethod.GET) public Test getTest(HttpServletRequest httpServletRequest, @CookieValue(value = "JSESSIONID", defaultValue = "defaultCookieValue") Ssortingng cookieValue) { Cookie cookie = new Cookie("test", "test"); cookie.setMaxAge(30 * 24 * 60 * 60); cookie.setPath("/"); ServletRequestAtsortingbutes attr = (ServletRequestAtsortingbutes) RequestContextHolder.currentRequestAtsortingbutes(); attr.getResponse().addCookie(cookie); return new Test(); } 

Quelqu’un peut-il aider, pourquoi il n’y a pas de cookie en réponse sur le serveur de noeud express? Peut-être que le problème est au spring? Je recherche sur ce point, mais je n’ai pas encore trouvé de réponse.