当前位置: 首页 > 知识库问答 >
问题:

标头中包含用户名和密码的SOAP客户端请求

孙玺
2023-03-14

我有以下Java客户端用于发出SOAP请求:

package com.example.petstore.test;

import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.example.petstore.schema.ProcessUpdateResponse;
import com.example.petstore.schema.SyncProcessDAO;

public class TestUtility {

    public static void main(String[] args) {

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();        

        // Use the URL defined in the soap address portion of the WSDL
        factory.setAddress("http://192.168.1.4:8080/MySyncService/services/SyncProcessDAOPort"); 

        // Utilize the class which was auto-generated by Apache CXF wsdl2java
        factory.setServiceClass(SyncProcessDAO.class);        

        Object client = factory.create();

        try {        

            // Call the Web Service to perform an operation
            GregorianCalendar gregory = new GregorianCalendar();
            XMLGregorianCalendar xmlgregory = DatatypeFactory.newInstance()
                    .newXMLGregorianCalendar(gregory);
            ProcessUpdateResponse response = ((SyncProcessDAO)client).gatherFunctionAttributes("hello1", "hello2", "hello3", 1, 2, xmlgregory, xmlgregory, "hello4", "hello5");    
             System.out.println("hahahaha");
            System.out.println(response);    

          } catch (SecurityException e) {

            e.printStackTrace();

          } catch (IllegalArgumentException e) {

            e.printStackTrace();

          } catch (DatatypeConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
}

我需要修改它,将用户名和密码作为WS-security标头的一部分。我该怎么做呢?

如果有用,我还附加了我的WSDL文件:

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="SyncProcessDAOService" targetNamespace="http://example.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://example.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
  <import namespace="http://example.com/" schemaLocation="my_schema1.xsd"/>
</schema>
  </wsdl:types>
  <wsdl:message name="gatherFunctionAttributesResponse">
    <wsdl:part name="parameters" element="tns:gatherFunctionAttributesResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="gatherFunctionAttributes">
    <wsdl:part name="parameters" element="tns:gatherFunctionAttributes">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="SyncProcessDAO">
    <wsdl:operation name="gatherFunctionAttributes">
      <wsdl:input name="gatherFunctionAttributes" message="tns:gatherFunctionAttributes">
    </wsdl:input>
      <wsdl:output name="gatherFunctionAttributesResponse" message="tns:gatherFunctionAttributesResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="SyncProcessDAOServiceSoapBinding" type="tns:SyncProcessDAO">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="gatherFunctionAttributes">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="gatherFunctionAttributes">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="gatherFunctionAttributesResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="SyncProcessDAOService">
    <wsdl:port name="SyncProcessDAOPort" binding="tns:SyncProcessDAOServiceSoapBinding">
      <soap:address location="http://localhost:8080/MySyncService/services/SyncProcessDAOPort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

共有1个答案

司寇飞航
2023-03-14

在客户端,您需要编写下面的代码来传递use/pwd作为

SyncProcessDAO client = (SyncProcessDAO)factory.create();
Map<String, Object> requestContext =   ((BindingProvider)client).getRequestContext();                              
Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>();
requestHeaders.put("username", "user");
requestHeaders.put("Password", "pwd");
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

发送到服务器前请先加密密码

有关服务器端更改的更多详细信息,请参见下面的链接

http://examples.javacodegeeks.com/enterprise-java/jws/application-authentication-with-jax-ws/

如果您想要实现jax-WS-Security,那么请遵循以下链接

http://cxf.apache.org/docs/ws-security.html

 类似资料:
  • 我正在尝试在SoapUI中发出SOAP请求,它需要使用用户名和密码进行身份验证。我让SoapUI基于wsdl文件生成一个测试,并尝试调用该服务。我按照SoapUI网站上的步骤使用身份验证(https://www.soapui.org/soap-and-wsdl/authenticating-soap-requests.html),但我不能让它工作。我不熟悉SOAP,所以我可能缺少一些基本的东西。我

  • 问题内容: 我正在开发客户端/服务器身份验证程序,但是遇到了问题。客户端可以很好地与服务器建立连接,但是一旦我输入密码和用户名,它就不会返回有效的用户名/密码。如果用户使用正确的用户名/密码服务器登录,则应返回“ Welcome,username”,如果无效,则返回“登录失败”。我查看了printwriter和bufferedreader文档,以确保我使用正确的方法在服务器/客户端之间正确传递文本

  • 拥有客户端密码的客户端可以使用RFC2617中定义的HTTP基本身份验证方案与授权服务器进行身份验证。客户端标识使用按照附录B的“application/x-www-form-urlencoded”编码算法编码,编码后的值用作用户名;客户端密码使用相同的算法编码并用作密码。授权服务器必须支持HTTP基本身份验证方案,用于验证被颁发客户端密码的客户端的身份。例如(额外的换行仅用于显示目的): Au

  • 很抱歉,如果这个问题是重复的,但是我在StackOverflow中尝试了几个解决方案,仍然无法发送SOAP请求。 我目前的情况是我的java应用程序需要向我的客户Web服务发送SOAP请求,这是我在SOAP UI中成功完成的,用户名,密码,身份验证类型:抢先。请看图片 现在我想在Java这样做,我已经创建了SOAP信封,没有设置密码,响应与SOAP UI中使用无身份验证完全相同,这意味着java代

  • 问题内容: 看起来很容易使用任何支持此功能的HTTP标头客户端向您的websocket客户端添加自定义HTTP标头,但是我找不到如何使用JSON API进行操作。 但是,似乎应该在规范中。任何人都知道如何实现它? 具体来说,我需要能够发送HTTP授权标头。 问题答案: 更新了2倍 简短答案: 不,只能指定路径和协议字段。 更长的答案: JavaScript WebSocketsAPI中没有用于指定

  • Java import java.io.IOException; import java.net.URLEncoder; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import jav