使用 non-ascii 凭据在 httpclient 4 中不起作用。3.x
Use of non-ascii credentials not working in httpclient 4.3.x
我查阅了 httpclient 4.3.3 APIs 以了解如何指定要用于 headers 的字符集,因此授权 header 包含 username/password可以使用特定的字符集,例如 UTF-8 或 iso-8859-1。用于此的已弃用 3.x API 是
httpMethodInstance.getParams().setHttpElementCharset("iso-8859-1");
我在 ConnectionConfig 中找到了 4.3.3 中的等价物 API。以下是我尝试使用的代码
HttpClientBuilder builder = HttpClientBuilder.create();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
builder.setDefaultCredentialsProvider(credentialsProvider);
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setCharset(Charset.forName("iso-8859-1")).build();
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager(
registryBuilder.build());
connManager.setConnectionConfig(connectionConfig);
builder.setConnectionManager(connManager);
HttpHost target = new HttpHost(host, port, scheme);
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
CloseableHttpClient httpclient = builder.build();
CloseableHttpResponse response = httpclient.execute(target, request, localContext);
但是在授权 header 中发送的凭据的 base64 编码值表明凭据未使用指定的字符集 "iso-8859-1" 进行编码。 ConnectionConfig.setCharset() 是用于设置 http header 字符集的正确方法吗?如果不是,那么 4.3.x?
中弃用的 setHttpElementCharset() 的正确等价物是什么
Apache 邮件存档 http://mail-archives.apache.org/mod_mbox/hc-dev/201407.mbox/%3CJIRA.12727350.1405435834469.45355.1405437005945@arcas%3E 表示这不受支持并建议使用 BasicSchemeFactory 但我似乎无法弄清楚 how/where 使用它来指定字符集。
自定义字符集编码适用于某些身份验证方案(例如 Basic 和 Digest),不适用于其他方案。全局自定义 auth charset 参数是个坏主意
凭据字符集必须使用自定义身份验证方案工厂按方案配置
Lookup<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
.register(AuthSchemes.BASIC, new BasicSchemeFactory(Consts.UTF_8))
.register(AuthSchemes.DIGEST, new DigestSchemeFactory(Consts.UTF_8))
.register(AuthSchemes.NTLM, new NTLMSchemeFactory())
.register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
.register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultAuthSchemeRegistry(authSchemeRegistry)
.build();
我查阅了 httpclient 4.3.3 APIs 以了解如何指定要用于 headers 的字符集,因此授权 header 包含 username/password可以使用特定的字符集,例如 UTF-8 或 iso-8859-1。用于此的已弃用 3.x API 是
httpMethodInstance.getParams().setHttpElementCharset("iso-8859-1");
我在 ConnectionConfig 中找到了 4.3.3 中的等价物 API。以下是我尝试使用的代码
HttpClientBuilder builder = HttpClientBuilder.create();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
builder.setDefaultCredentialsProvider(credentialsProvider);
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setCharset(Charset.forName("iso-8859-1")).build();
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager(
registryBuilder.build());
connManager.setConnectionConfig(connectionConfig);
builder.setConnectionManager(connManager);
HttpHost target = new HttpHost(host, port, scheme);
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
CloseableHttpClient httpclient = builder.build();
CloseableHttpResponse response = httpclient.execute(target, request, localContext);
但是在授权 header 中发送的凭据的 base64 编码值表明凭据未使用指定的字符集 "iso-8859-1" 进行编码。 ConnectionConfig.setCharset() 是用于设置 http header 字符集的正确方法吗?如果不是,那么 4.3.x?
中弃用的 setHttpElementCharset() 的正确等价物是什么Apache 邮件存档 http://mail-archives.apache.org/mod_mbox/hc-dev/201407.mbox/%3CJIRA.12727350.1405435834469.45355.1405437005945@arcas%3E 表示这不受支持并建议使用 BasicSchemeFactory 但我似乎无法弄清楚 how/where 使用它来指定字符集。
自定义字符集编码适用于某些身份验证方案(例如 Basic 和 Digest),不适用于其他方案。全局自定义 auth charset 参数是个坏主意
凭据字符集必须使用自定义身份验证方案工厂按方案配置
Lookup<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
.register(AuthSchemes.BASIC, new BasicSchemeFactory(Consts.UTF_8))
.register(AuthSchemes.DIGEST, new DigestSchemeFactory(Consts.UTF_8))
.register(AuthSchemes.NTLM, new NTLMSchemeFactory())
.register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
.register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
.build();
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultAuthSchemeRegistry(authSchemeRegistry)
.build();