Фильтр Джерси не дает значения заголовка - PullRequest
0 голосов
/ 08 мая 2018

Мы используем jersey 2 для наших веб-сервисов REST на Java. Мы создали javax.ws.rs.container.ContainerRequestFilter и javax.ws.rs.container.ContainerResponseFilter

У нас есть заголовки при отправке запроса, такие как appKey, secret, token и т. Д. Если мы получим запрос от Почтальона, он выдаст все заголовки с их значениями следующим образом:

{
  host=[localhost:8080], 
  connection=[keep-alive], 
  authorization=[bearer <token>], 
  cache-control=[no-cache],  
  x-request-id=[<request-id>], 
  x-api-secret=[<secret>], 
  user-agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36], 
  x-api-key=[api-key], 
  postman-token=[<postman-token>], 
  accept=[*/*], 
  accept-encoding=[gzip, deflate, br], 
  accept-language=[en-US,en;q=0.9]
}

и если мы нажмем на запрос от нашего веб-клиента, он выдаст значения в access-control-request-headers следующим образом ( только ключи, а не их значения ):

{
  host=[localhost:8080], 
  connection=[keep-alive], 
  access-control-request-method=[GET], 
  origin=[http://resttesttest.com], 
  user-agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36], 
  access-control-request-headers=[authorization,x-api-key,x-api-secret,x-request-id], 
  accept=[*/*],
  accept-encoding=[gzip, deflate, br],
  accept-language=[en-US,en;q=0.9]
}

почему он не дает значения параметров заголовка?

Как их получить?

Пожалуйста, объясните мне это. Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Во-первых, это request заголовки, которые вы показываете, а не response заголовки, которые, как вам кажется, и есть.

Здесь вы видите заголовки запроса CORS preflight , а не фактический запрос. Предварительный запрос - это запрос, который браузер выполняет перед фактическим запросом, проверяя на сервере, что запрос разрешен. Если предпечатная проверка одобрена, то будет сделан реальный запрос. В предварительном просмотре браузер спрашивает сервер, разрешит ли он перечисленные заголовки. Это в заголовке запроса access-control-request-headers. Точно так же он использует access-control-request-method, чтобы спросить сервер, разрешит ли он GET вызов метода.

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

  • Access-Control-Allow-Origin - это ответ на заголовок запроса предварительной проверки Origin. Значение должно включать значение источника или *, чтобы разрешить все источники. Это говорит браузеру, что происхождение разрешено.

  • Access-Control-Allow-Headers - это ответ на заголовок запроса предварительной проверки access-control-request-headers. Значение должно быть разделенным запятыми списком как минимум всех заголовков, запрошенных браузером. Если какой-либо из них отсутствует, предварительный запрос не будет выполнен.

  • Access-Control-Allow-Methods - это ответ на заголовок запроса предварительной проверки access-control-request-method. Значение должно быть, по крайней мере, запрошенным методом или обычно разрешенным списком методов.

Если вы посмотрите на этот пост , вы увидите, что ContainerResponseFilter используется для обработки возврата этого предварительного запроса путем добавления всех необходимых заголовков для прохождения предварительной проверки.

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext request,
                       ContainerResponseContext response) throws IOException {

        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

В вашем случае вы хотели бы добавить заголовки x-api-key,x-api-secret,x-request-id в список в Access-Control-Allow-Headers. Эти значения сообщают браузеру, что отправка этих заголовков в порядке.

После успешного предварительного запроса браузер отправит фактический запрос. Если предварительная проверка не удалась, то обычно браузер подсказывает вам, какие проверки не пройдены.

...