2017-02-08 5 views
0

Привет Я пытаюсь получить как http & https-протоколы, доступные в веб-службе Spring Boot. Я следовал этому руководству: https://drissamri.be/blog/java/enable-https-in-spring-boot/Метод переадресации HTTP -> HTTPS - HTTP-статус 405 (Весенняя загрузка)

HTTPS Post метод работает, но http нет. Я тестирую его через SoapUI, и он выбрасывает HTTP status 405 - Method not allowed.

Это как метод запроса/ответа выглядит в коде:

private static final String NAMESPACE_URI = "http://...."; 

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getRequest") 
@ResponsePayload 
public GetResponse getRequest(@RequestPayload GetRequest request){...} 

Любой фрагмент кода я должен приложить?

Благодарим за помощь.

ответ

-3

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

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-enable-multiple-connectors-in-tomcat

UPDATE:

import org.apache.catalina.connector.Connector; 
import org.apache.coyote.http11.Http11NioProtocol; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; 
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

import java.io.File; 

@Configuration 
public class HttpsConnector { 

    @Value("${cert.keyStore}") 
    private String keyStorePath; 

    @Value("${cert.trustStore}") 
    private String trustStorePath; 

    @Value("${cert.keyStorePass}") 
    private String keyStorePass; 

    @Value("${cert.trustStorePass}") 
    private String trustStorePass; 

    @Value("${cert.keyStoreType}") 
    private String keyStoreType; 

    @Value("${cert.trustStoreType}") 
    private String trustStoreType; 

    @Value("${cert.keyAlias}") 
    private String keyAlias; 

    @Value("${cert.httpsPort}") 
    private int httpsPort; 

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
     TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); 
     tomcat.addAdditionalTomcatConnectors(createSslConnector()); 
     return tomcat; 
    } 

    private Connector createSslConnector() { 
     Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
     Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); 

     String absKeyStorePath = getAbsolutePath(keyStorePath); 
     String absTrustStorePath = getAbsolutePath(trustStorePath); 

     connector.setScheme("https"); 
     connector.setSecure(true); 
     connector.setPort(httpsPort); 
     protocol.setSSLEnabled(true); 
     protocol.setKeystoreType(keyStoreType); 
     protocol.setKeystoreFile(absKeyStorePath); 
     protocol.setKeystorePass(keyStorePass); 
     protocol.setTruststoreType(trustStoreType); 
     protocol.setTruststoreFile(absTrustStorePath); 
     protocol.setTruststorePass(trustStorePass); 
     protocol.setKeyAlias(keyAlias); 
     return connector; 
    } 

    private String getAbsolutePath(String path) { 
     File file = new File(path); 
     if (!file.isAbsolute()) { 
      path = file.getAbsolutePath(); 
     } 
     return path; 
    } 
} 

конфигурации:

#SERVER CONFIG 
server.port=8090  

#Certificate 
cert.keyStore=src/main/resources/keystore.p12 
cert.trustStore=src/main/resources/keystore.p12 
cert.keyStorePass=... 
cert.trustStorePass=... 
cert.keyStoreType=pkcs12 
cert.trustStoreType=pkcs12 
cert.keyAlias=... 
cert.httpsPort=8443 
+0

Я следую тому же учебнику https://drissamri.be/blog/java/enable-https-in-spring-boot/, но я не могу заставить его работать. Что вы должны изменить, чтобы сделать эту работу? – juventus

+0

@juventus У меня есть обновленный ответ. В учебнике HTTPS по умолчанию и HTTP делается программно, в документации это делается в обратном порядке. Я оставил конфигурацию по умолчанию (server.port = 8090), добавил значения «cert», и я реализовал коннектор HTTPS. См. Обновленный ответ. Теперь я могу позвонить в службу либо с http 8090, либо с https 8443. – Wlad

-1

Я имел такая же ошибка 405 для запросов POST. Я нашел способ исправить это.

Чтобы включить и HTTPS и HTTP с GET и POST я должен был добавить следующее к @Configuration класса вместо TomcatEmbeddedServletContainerFactory, как описано в посте:

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer() { 
    return container -> { 
     if (container instanceof TomcatEmbeddedServletContainerFactory) { 
      TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) container; 
      Connector connector = new Connector(TomcatEmbeddedServletContainerFactory.DEFAULT_PROTOCOL); 
      connector.setPort(httpPort); 
      containerFactory.addAdditionalTomcatConnectors(connector); 
     } 
    }; 
} 

Надеется, что это помогает людям будут иметь такая же проблема в будущем.