Java 尝试使用HttpClient获取DOMINO HTTP会话——响应代码始终为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

我的Domino服务器已启用会话身份验证,HTTP端口号配置为8080

当我执行下面的程序来获得DominoHTTP会话时,我总是得到下面的输出

我知道响应代码200表示运行平稳。但是我没有看到在服务器上创建任何HTTP会话。即使我向UsernamePasswordCredentials(“xxxxx”、“xxxxx”)提供了错误的凭据,它仍然返回200作为其响应代码。有什么建议吗

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。