java - 使用httpClient创建HttpComponentsMessageSender

原文 标签 java spring soap httpclient kerberos

我无法使用Kerberos授权到SOAP服务器。
这是我的配置代码

  @Bean
  def webServiceTemplate(): WebServiceTemplate = {
    val webServiceTemplate = new WebServiceTemplate()
    webServiceTemplate.setMarshaller(marshaller.marshaller)
    webServiceTemplate.setUnmarshaller(marshaller.marshaller)
    webServiceTemplate.setDefaultUri(Parameters.getDefaultURI)
    webServiceTemplate.setMessageSender(httpComponentsMessageSender())
    webServiceTemplate
  }

@Bean
  def httpComponentsMessageSender(): HttpComponentsMessageSender = {
    val sender = new HttpComponentsMessageSender()
    if(Parameters.isProduction){
      sender.setHttpClient(getHttpClient())
    } else sender.setCredentials(usernamePasswordCredentials())
    sender
  }

  @Bean
  def usernamePasswordCredentials(): NTCredentials = {
    new NTCredentials(
       "usr",
       "pass",
      "",
      "MY_COMPANY"
    )
  }

  @Bean
  def getHttpClient() = {
    val builder = HttpClientBuilder.create
    val authSchemeRegistry = RegistryBuilder.create[AuthSchemeProvider]
      .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build
    builder.setDefaultAuthSchemeRegistry(authSchemeRegistry)
    builder.setDefaultCredentialsProvider(getCredProvider())
    builder.addInterceptorFirst(new RemoveSoapHeadersInterceptor())
    builder.build
  }


我的HttpClient可以向oozie等其他kerberized服务发出请求。但是,当使用SOAP服务器时,

Caused by: org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
        at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:609)
        at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
        at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
        at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378)


我使用krb5module并发出如下请求

reply = Subject.doAs(subject, new PrivilegedExceptionAction[CreateReply]() {
          @throws[Exception]
          override def run: CreateReply = getWebServiceTemplate
            .marshalSendAndReceive("http://my-soap-service", request)
            .asInstanceOf[CreateReply]


如何授权使用SOAP服务?我究竟做错了什么?

最佳答案

原来我使用了错误的路径(http://my-soap-service)。我更改为有效的并且可以授权。

结论:HttpClient属性可以帮助为SAOP设置HttpComponentsMessageSender。

关于java - 使用httpClient创建HttpComponentsMessageSender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60844986/

相关文章:

java - 测试中的Spring Hibernate保存实体不存在

java - Spring 注入(inject),全局变量

spring - 如何在Spring Boot属性中设置Tomcat的SlowQueryReport拦截器的阈值

soap - 使用soap的php7 symfony cli命令的段错误

php 从 SOAP SERVER 获取 SOAP 头用户名和密码

java - 返回值对

java - JPA:@OneToOne使用随机生成的名称创建一个隐式唯一约束。有什么办法可以使用注释在代码中使用该名称吗?

php - SoapFault 未授权 - 连接到 Purolator Web 服务

java - 尝试在Android上使用Google Map时出现异常

java - 如何终止一个 Observable?