我有以下代码向服务器发出POST请求。但是,Web服务器可以是Apache或IIS。
Client client = new Client(new Context(), Protocol.HTTP);
ClientResource resource = new ClientResource(url);
resource.setRetryOnError(false);
resource.setNext(client);
resource.setChallengeResponse(ChallengeScheme.HTTP_BASIC,userName,pwd);
response = resource.post(representation);
以下代码适用于apache,但IIS因以下错误而失败:
WARNING: Couldn't find any helper support the HTTP_NTLM challenge scheme.
WARNING: Couldn't find any helper support the HTTP_Negotiate challenge scheme.
Exception in thread "main" Unauthorized (401) - The request requires user authentication
可能原因是apache使用基本身份验证而IIS使用NTML。第一次尝试显然是将IIS中的挑战方案更改为NTLM,如下所示,但是得到了相同的错误(我已经为restlet jar添加了网络扩展)。
resource.setChallengeResponse(ChallengeScheme.HTTP_NTLM, userName, pwd);
另外,我认为有一种方法可以使用Apache http客户端(NTCredentials)类,但我仍然希望使用restlet jar来避免对现有代码进行大量更改。
有什么建议吗?任何帮助,将不胜感激。 提前谢谢。
答案 0 :(得分:1)
Restlet中没有对NTLM的内置支持。 Restlet Github存储库中的一个问题涉及这样的方面:https://github.com/restlet/restlet-framework-java/issues/467。
我还在Restlet文档中看到了有关NTLM的页面:http://restlet.com/technical-resources/restlet-framework/guide/2.3/core/security/ntml-authentication。但它似乎有点过时,特别是对于HTTPClient部分。此外,不推荐使用HTTP客户端扩展,并将在版本3中删除。应改为使用Jetty扩展。
也就是说,您可以尝试使用Java本身提供的NTLM支持。为此,您需要使用Restlet的默认HTTP客户端,即在类路径中未提供客户端连接器时使用的客户端。以下是使用示例:
final String username = "username";
final String password = "password";
// Create your own authenticator
Authenticator a = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication(
username, password.toCharArray()));
}
};
// Sets the default Authenticator
Authenticator.setDefault(a);
ClientResource cr = new ClientResource("http://...");
cr.post(...);
希望它可以帮到你, 亨利