Spring REST Controller не отвечает на угловой запрос - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть приложение для создания запросов на сертификат сервера, как если бы вы использовали Java Keytool или что-то в этом роде.Я пытаюсь вернуть созданный запрос сертификата и ключ в zip-файле, но я не могу заставить свой контроллер REST ответить на запрос http.ИСПРАВЛЕНИЕ: контроллер отвечает, но код в методе никогда не выполняется.

Сервер получает запрос, потому что мой фильтр CORS выполняется.Но у меня есть отладочный набор в методе контроллера, и он никогда не срабатывает.Подпись метода правильная?Мне нужен еще один набор глаз, пожалуйста?

Вот мой код контроллера:

@RequestMapping(method = RequestMethod.POST, value = "/generateCert/")
public ResponseEntity<InputStreamResource> generateCert(@RequestBody CertInfo certInfo) {
    System.out.println("Received request to generate CSR...");

    byte[] responseBytes = commonDataService.generateCsr(certInfo);
    InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(responseBytes));

    System.out.println("Generated CSR with length of " + responseBytes.length);
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=certificate.zip")
            .contentType(MediaType.parseMediaType("application/zip"))
            .contentLength(responseBytes.length)
            .body(resource);
}

И вот угловой запрос:

generateCertificate(reqBody: GenerateCert) {
   let headers = new Headers();
   headers.append('Content-Type', 'application/json');

   this.http.post(this.urlGenerateCert, JSON.stringify(reqBody), {headers: headers}).subscribe(
    (data) => {
        let dataType = data.type;
        let binaryData = [];
        binaryData.push(data);
        this.certBlob = new Blob(binaryData);
    });
    return this.certBlob;
 }

И, наконец,заголовки запроса и ответа, скопированные с сетевой панели:

Response
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Authorization, Accept, X-Requested-With, remember-me
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 3600
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Thu, 27 Dec 2018 22:48:00 GMT
Expires: 0
Location: http://localhost:8102/login
Pragma: no-cache
Set-Cookie: JSESSIONID=EDACE17328628D579670AD0FB53A6F35; Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

Request
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 205
Content-Type: application/json
Host: localhost:8102
Origin: http://localhost:4200
Referer: http://localhost:4200/generateCerts
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36

Я действительно изо всех сил пытался заставить работать CORS, так что, возможно, это мешает запросу?Я ненавижу публиковать весь этот код, если это абсолютно необходимо.У кого-нибудь есть идеи?

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Спасибо всем, кто внес свой вклад.Я обнаружил, что ошибка произошла из-за заголовков моего метода контроллера.После их изменения метод был вызван правильно.Вот что сработало:

@RequestMapping(method = RequestMethod.POST, path = "/generateCert", 
    produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE}, consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<byte[]> generateCert(@RequestBody CertInfo certInfo) {
    byte[] responseBytes = commonDataService.generateCsr(certInfo);    
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE)
            .contentLength(responseBytes.length)
            .body(responseBytes);
}
0 голосов
/ 04 января 2019

Когда Angular встречает этот оператор

this.http.post(url,body).subscribe(data => # some code
);

Он немедленно возвращается для выполнения остальной части кода, пока служба продолжает выполняться.Точно так же, как Future в Java.

Здесь, если вы

return this.cert;

Вы не получите значение, которое в конечном итоге может быть заполнено службой this.http.Так как страница уже отрисована и код выполнен.Вы можете убедиться в этом, включив это в и за пределами наблюдаемой.

console.log(“Inside/outside observable” + new Date().toLocalTimeString());
0 голосов
/ 06 января 2019

В списке заголовков запроса / ответа отсутствует информация о URL, методе и наиболее важном коде статуса ответа.

Просмотр Location: http://localhost:8102/login среди заголовков ответа Я могу предположить, что это может быть 401 Unauthorized или что-либо еще, что перенаправляетна страницу входа.Следовательно, если в цепочке фильтров есть фильтр авторизации, он может быть виновником.

Следующие заголовки запроса

Host: localhost:8102
Origin: http://localhost:4200

предполагают, что вы выполняете CORS, и фильтр CORS может бытьдействительно участвует и выполняет ответ до того, как запрос будет направлен на контроллер.Я предлагаю установить точку останова в фильтре CORS (и в других, если таковые имеются) и отладить его до точки, в которой возвращается ответ.

0 голосов
/ 04 января 2019

определить proxy.conf.json

{
"/login*": {
    "target":"http://localhost:8080",
    "secure":false,
    "logLevel":"debug"
    }
} 

теперь в вашем package.json

"scripts": {
    "start":"ng serve --proxy-config proxy.config.json"
}

Я думаю, что естьпроблема при получении соединения в обоих webapp.please попробуйте.

...