在HTTP请求标头中插入用户凭据

时间:2010-07-15 09:04:08

标签: java http header request web-services

我正在尝试将用户凭据插入到HTTP请求标头中,然后通过https将其发送到Web服务,而Web服务又会出于授权目的读取它们...

客户端和服务都是用Java编写的。

在客户端,我执行以下操作:

ExampleImplService service = new ExampleImplService();
Example port = service.getExampleImplPort();

Map<String, Object> reqContext = ((BindingProvider) port).getRequestContext();
Map<String, List<String>> reqHeader = new HashMap<String, List<String>>();
reqHeader.put("Username", Collections.singletonList("user"));
reqHeader.put("Password", Collections.singletonList("password"));
reqContext.put(MessageContext.HTTP_REQUEST_HEADERS, reqHeader);

System.out.println(port.somemethod());

如果我以编程方式添加reqContext,我会看到添加的标题。但是通过tcpmon,我可以看到,他们没有发送到Web服务......当然,我也无法在Web服务的任何地方找到它们。

知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

我相信你使用jax-ws进行网络服务消费,所以我的答案将面向它

您可以像这样设置用户名和密码属性

reqContext.put( BindingProvider.USERNAME_PROPERTY, "user" );
reqContext.put( BindingProvider.PASSWORD_PROPERTY, "password" );

如果这不起作用,您可能需要一个Authenticator(不适用于Axis2)

here

复制
class MyAuthenticator extends Authenticator {
    private String username, password;

    public MyAuthenticator(String user, String pass) {
        username = user;
        password = pass;
        setDefault( this );
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        System.out.println("Requesting Host  : " + getRequestingHost());
        System.out.println("Requesting Port  : " + getRequestingPort());
        System.out.println("Requesting Prompt : " + getRequestingPrompt());
        System.out.println("Requesting Protocol: " + getRequestingProtocol());
        System.out.println("Requesting Scheme : " + getRequestingScheme());
        System.out.println("Requesting Site  : " + getRequestingSite());

        return new PasswordAuthentication(username, password.toCharArray());
    }
}