Метод недопустимый HTTPS spring - PullRequest
0 голосов
/ 10 июля 2020

как дела?

У меня RestApi построен в Spring. Есть несколько функциональных конечных точек, использующих методы GET и POST. Я попытался добавить конфигурацию https , как показано ниже:

@Configuration
public class ServerConfig {

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    tomcat.addAdditionalTomcatConnectors(getHttpConnector());
    return tomcat;
}

private Connector getHttpConnector() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8080);
    connector.setSecure(false);
    connector.setRedirectPort(8081);
    return connector;
  }
}

Раньше у меня было вроде http://localhost:8080/api/candidates [GET], а после добавления этого класса URL-адрес перенаправлялся на https , что нормально, теперь я перенаправляюсь на https://localhost:8081/api/candidates.

После этого я сделал это, когда я пытаюсь получить доступ к конечной точке без HTTPS http://localhost:8080/api/candidates, используя GET, я могу получить всю информацию, но когда я пытаюсь использовать POST для отправки некоторых данных, я получаю Method not allowed, но GET еще работает. Кто-нибудь знает почему?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Я нашел этот пост, и это было именно то, что я искал. Если вы хотите увидеть, пожалуйста, отметьте Spring Boot: перенаправление с HTTP на HTTPS приводит к ошибке 405 для метода PUT

Перенаправление предназначено специально для информирования клиента (например, веб-браузера) о том, что выполнить запрос GET с использованием заданного URL-адреса, поэтому результатом перенаправления не может быть PUT, POST, DELETE или любой другой метод HTTP.

В этом контексте основной целью перенаправления на HTTPS является обеспечение безопасности соединение от слежки, то есть гарантировать, что никто не сможет увидеть конфиденциальную информацию. Это хорошо работает для GET, поскольку вы еще не отправили конфиденциальную информацию1, предполагая, что это ответ, содержащий конфиденциальную информацию.

Перенаправление PUT или POST на HTTPS бессмысленно, поскольку вы уже отправили полезную нагрузку (конфиденциальные данные) по незащищенному соединению.

Вашему клиенту нужно указать использовать HTTPS перед отправкой данных, т.е. когда он создает запрос PUT / POST, ему необходимо предоставить URL HTTPS.

Исправьте код клиента, например код JavaScript, который генерирует HTTP PUT, чтобы он использовал HTTPS. Перенаправление происходит слишком поздно и совершенно неверно.

На самом деле хорошо, что перенаправление PUT не удалось, потому что это заставляет вас правильно защищать свое веб-приложение. Если бы это не сработало, вы бы ошибочно подумали, что ваше веб-приложение защищено перенаправлением, хотя на самом деле это не так.

0 голосов
/ 10 июля 2020

Перенаправление запросов GET - это не то же самое, что перенаправление запросов POST. Пожалуйста, прочтите это . Они заявляют следующее:

Перенаправление запросов GET, которые не содержат данных, кроме строки запроса, - это простой процесс. Однако запросы POST сложнее перенаправить, поскольку браузер, отвечающий на перенаправление 302 или 301, преобразует начальный запрос POST в запрос GET - процесс, который теряет исходные данные запроса POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...