Java 尝试使用HttpClient获取DOMINO HTTP会话——响应代码始终为200
我的Domino服务器已启用会话身份验证,HTTP端口号配置为8080 当我执行下面的程序来获得DominoHTTP会话时,我总是得到下面的输出 我知道响应代码200表示运行平稳。但是我没有看到在服务器上创建任何HTTP会话。即使我向UsernamePasswordCredentials(“xxxxx”、“xxxxx”)提供了错误的凭据,它仍然返回200作为其响应代码。有什么建议吗Java 尝试使用HttpClient获取DOMINO HTTP会话——响应代码始终为200,java,android,lotus-notes,lotus-domino,apache-httpcomponents,Java,Android,Lotus Notes,Lotus Domino,Apache Httpcomponents,我的Domino服务器已启用会话身份验证,HTTP端口号配置为8080 当我执行下面的程序来获得DominoHTTP会话时,我总是得到下面的输出 我知道响应代码200表示运行平稳。但是我没有看到在服务器上创建任何HTTP会话。即使我向UsernamePasswordCredentials(“xxxxx”、“xxxxx”)提供了错误的凭据,它仍然返回200作为其响应代码。有什么建议吗 public class ClientAuthentication { public static voi
public class ClientAuthentication {
public static void main(String[] args) {
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
httpclient.getCredentialsProvider().setCredentials( new AuthScope("10.40.xx.xx", 8080),
new UsernamePasswordCredentials("xxxxx", "xxxxx"));
HttpPost httppost = new HttpPost("http://10.40.xx.xx:8080/names.nsf?Login");
System.out.println("executing request" + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK){
System.out.println("---------------OKAY OKAY-------------------------");
System.out.println("RESPONSE CODE " + response.getStatusLine().getStatusCode());
}
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
executing requestPOST http://10.40.xx.xx:8080/names.nsf?Login HTTP/1.1
---------------OKAY OKAY-------------------------
RESPONSE CODE 200
Response content length: 4256
您已设置会话身份验证。但是您正在尝试通过默认的getCredentialsProvider进行基本身份验证。您得到的200响应是实际的会话身份验证登录表单,您应该发布该表单 正确的顺序是
- 使用您正在登录的数据库的URL进行GET
- 以服务器的登录表单作为响应接收200
- 填写表单数据的用户名和密码名称/值对并发布
理论上,您应该编写自己的类来实现为Domino会话身份验证表单定制的CredentialsProvider接口,并将其与扩展AbstractHttpClient的自己的DominoHttpClient类一起使用,以便干净地实现此seuchence;但我认为这真的不值得这么做 Narasimha,正如@Richard所指出的,您的请求在发布时没有会话id。服务器将其视为新请求,因此提供登录页面 现在要解决这个问题,您需要在实际发布登录请求之前至少访问该站点一次。您可以请求登录页面 在执行post请求之前输入以下代码
HttpMethod method = new GetMethod("http://10.40.xx.xx:8080/names.nsf?Login");
httpclient.executeMethod(method);
这将创建一个会话id,该id将在后续请求中传递 您如何在服务器上检查会话是否在其上创建?在Domino管理员窗口中,我可以看到有多少internet用户已连接以及他们是谁。如果我通过web浏览器登录/验证,它工作正常,我可以看到那些已连接的用户/创建的会话。请打印响应内容并查看响应内容。响应:HTTP/1.1200 OK[服务器:Lotus Domino,日期:Tue,2012年9月25日08:40:06 GMT,过期时间:Tue,1980年1月1日06:00:00 GMT,内容类型:text/html;charset=UTF-8,内容长度:4256,缓存控制:无缓存]这些是响应头。我指的是响应主体,我遵循上面的顺序,现在能够在Domino上创建HTTP会话。非常感谢。但你说“我觉得不值得这么做”?我们还有其他方法吗?我对创建自己的类以扩展AbstractHttpClient并实现CredentialsProvider所做的额外工作发表了评论。除非我正在为多个Domino环境构建和维护多个应用程序,否则我自己可能不会为此烦恼。如果只是针对单个应用程序或一个目标Domino环境,我可能只需要在Main()中编写代码来执行GET,验证200响应,验证表单是否包含预期字段,然后生成POST。