Java Base64编码基本身份验证头Apache HTTP客户端

Java Base64编码基本身份验证头Apache HTTP客户端,java,apache,authentication,httpclient,basic-authentication,Java,Apache,Authentication,Httpclient,Basic Authentication,两个相关的问题,我正在使用ApacheHTTP客户端4.xapi。myHttpPost是HttpPost的实例,myHttpClient是HttpClient的实例。我正在尝试使用基本身份验证发送请求。所以我有一个HttpClient并创建了一个HttpPost 设置基本身份验证头的“暴力”方式似乎是在HttpPost头中设置它 String encoding = Base64Encoder.encode("username" + ":" + "password"); myHttpPost.se

两个相关的问题,我正在使用ApacheHTTP客户端4.xapi。myHttpPost是HttpPost的实例,myHttpClient是HttpClient的实例。我正在尝试使用基本身份验证发送请求。所以我有一个HttpClient并创建了一个HttpPost

设置基本身份验证头的“暴力”方式似乎是在HttpPost头中设置它

String encoding = Base64Encoder.encode("username" + ":" + "password");
myHttpPost.setHeader("Authorization", "Basic " + encoding);
上面的例子来自另一个堆栈溢出问题(现在找不到指向它的链接)。关于Base64Encoder类,我会在哪个包中找到它,或者从哪里下载它

主要问题-我希望使用以下代码以更美观的方式进行基本身份验证:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);
但这似乎不起作用。那么,上面的第一个示例是使用ApacheHTTP客户端4.0进行基本身份验证的正确方法吗?还是有更干净/更简单的方法

关于Base64Encoder类,我会找到哪个包 或者从哪里下载

Base64编码器可以来自不同的地方,我找不到与您的静态
encode
方法匹配的东西

至于凭据,您需要在
AuthScope
上将
scheme
设置为
Basic
,如下所示:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
    new UsernamePasswordCredentials("username", "password")
);


HttpClient
不会尝试向源服务器或代理服务器进行身份验证,除非明确提出质疑。我怀疑您希望
HttpClient
先进行身份验证。虽然抢占式身份验证在默认情况下是禁用的(我个人不鼓励在安全或内部网络之外使用它),但可以使用下面的示例强制进行抢占式身份验证


我尝试了中建议的解决方案,它适用于Base64编码基本身份验证。 我想

 // Create AuthCache instance
 AuthCache authCache = new BasicAuthCache();
 // Generate BASIC scheme object and add it to the local
 // auth cache
 BasicScheme basicAuth = new BasicScheme();
 authCache.put(target, basicAuth);

 // Add AuthCache to the execution context
 HttpClientContext localContext = HttpClientContext.create();
 localContext.setAuthCache(authCache);
创造奇迹:)
由于没有这篇文章,我总是收到“401未经授权”的HTTP响应

我知道这是一篇非常古老的文章。但是,我只是想回答一下,这样其他人将来也会受益:

如果您使用的用户名将使用可变宽度编码()表示,请确保更改用于形成(用户名:密码)字节的编码,如下所示: HttpParams params=新的BasicHttpParams(); setParameter(AuthPNames.CREDENTIAL_字符集,HTTP.UTF_8)


默认情况下,使用的编码是HttpProtocolParams.HTTP_ELEMENT_CHARSET。

谢谢TEG-我尝试了这个,但没有成功(尝试了文本“basic”和常量)。我已经更新了问题以反映这个附加参数。Base64编码的标题确实有效,但解决方案仍然有效。感谢回复oleg-我们太忙了,无法验证它是否有效,但会找到它。我猜您答案的第二个单词中有拼写错误。“疲倦”->“尝试”
 // Create AuthCache instance
 AuthCache authCache = new BasicAuthCache();
 // Generate BASIC scheme object and add it to the local
 // auth cache
 BasicScheme basicAuth = new BasicScheme();
 authCache.put(target, basicAuth);

 // Add AuthCache to the execution context
 HttpClientContext localContext = HttpClientContext.create();
 localContext.setAuthCache(authCache);