同时使用代理与身份验证时Axis2客户端抛出401未授权错误
Axis2客户端同时配置代理与服务端基础认证时出现401未授权问题
配置说明
基于Axis2官方快速入门的StockQuoteService示例开发服务客户端,新增以下配置:
- 连接非localhost的远程服务端
- 服务端基础身份认证配置(非NTLM认证,未使用证书):
// Authentication: HttpTransportPropertiesImpl.Authenticator auth = new HttpTransportPropertiesImpl.Authenticator(); auth.setAllowedRetry(true); auth.setUsername("wsuser"); auth.setPassword("wspass"); options.setProperty(HTTPConstants.AUTHENTICATE, auth);
- 代理配置:
// Proxy: HttpTransportProperties.ProxyProperties proxyProperties = new HttpTransportProperties.ProxyProperties(); proxyProperties.setProxyName("255.255.255.255"); proxyProperties.setProxyPort(0000); proxyProperties.setUserName("proxyuser"); proxyProperties.setPassWord("proxypass"); options.setProperty(HTTPConstants.PROXY, proxyProperties);
问题现象
- 仅启用代理(服务端关闭身份验证):客户端正常工作
- 仅启用服务端身份验证(注释代理配置):客户端正常工作
- 同时启用两者:抛出401未授权错误,错误栈如下:
org.apache.axis2.AxisFault: Transport error: 401 Error: Unauthorized at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:212) at org.apache.axis2.transport.http.AbstractHTTPTransportSender.writeMessageWithCommons(AbstractHTTPTransportSender.java:386) at org.apache.axis2.transport.http.AbstractHTTPTransportSender.invoke(AbstractHTTPTransportSender.java:214) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:431) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:399) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:150) at qt.axis2Clients.StockQuoteServiceStub.getPrice(StockQuoteServiceStub.java:153) at qt.axis2Clients.StQuClientAdb.getPrice(StQuClientAdb.java:105) at qt.axis2Clients.StQuClientAdb.main(StQuClientAdb.java:75)
该问题在HTTP和HTTPS场景下均会出现,浏览器可正常访问目标服务,服务端与代理的用户名密码均正确,怀疑是配置遗漏或Axis2自身兼容问题,寻求解决方案。
完整测试代码
public static void main(java.lang.String args[]) { try { // set Path to certificates: TrustStore.assureJssecacertsFile(); TrustStore.setTrustStoreProperty(); // Set path to 'axis.xml': File axis2Xml = new File("static/webapps/axis2/WEB-INF/conf/axis2.xml"); String absPath = axis2Xml.getAbsolutePath(); System.setProperty(Constants.AXIS2_CONF, absPath); // URL: StockQuoteServiceStub stub = new StockQuoteServiceStub( "https://"+ urlToServer +"/axis2/services/StockQuoteService"); // options: Options options = stub._getServiceClient().getOptions(); options.setProperty(HTTPConstants.CHUNKED, false); // Authentication: HttpTransportPropertiesImpl.Authenticator auth = new HttpTransportPropertiesImpl.Authenticator(); auth.setAllowedRetry(true); auth.setUsername("wsuser"); auth.setPassword("wspass"); options.setProperty(HTTPConstants.AUTHENTICATE, auth); // Proxy: HttpTransportProperties.ProxyProperties proxyProperties = new HttpTransportProperties.ProxyProperties(); proxyProperties.setProxyName("255.255.255.255"); proxyProperties.setProxyPort(0000); proxyProperties.setUserName("proxyuser"); proxyProperties.setPassWord("proxypass"); options.setProperty(HTTPConstants.PROXY, proxyProperties); // execute: getPrice(stub); update(stub); getPrice(stub); } catch (Exception e) { e.printStackTrace(); System.err.println("\n\n\n"); } }
内容的提问来源于stack exchange,提问作者Ellolo17
相关产品推荐
相关产品推荐

