有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java apache commons httpclient 4.23表单登录问题不同请求中使用的不同会话cookie

我有一个受保护的资源,需要我登录。我正在使用commons客户端和以下代码块

    HttpClient httpClient = new HttpClient();
    httpClient.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
    httpClient.getParams().setParameter("http.protocol.single-cookie-header", Boolean.TRUE);

    PostMethod postMethod = new PostMethod("/admin/adminlogon.do");
    postMethod.setRequestEntity(new StringRequestEntity("action=logon&adminUser=admin&adminPassword=password",
            "application/x-www-form-urlencoded",
            "UTF-8"));
    postMethod.addParameter("action","logon");
    postMethod.addParameter("adminUser","admin");
    postMethod.addParameter("adminPassword","password");

    httpClient.executeMethod(postMethod);
    String response2 = postMethod.getResponseBodyAsString();

上面是我基本登录的地方。这很好,我得到了一个很好的小JSESSIONID饼干回来

    GetMethod get = new GetMethod("/admin/api.do?action=getSomeJson");
    httpClient.executeMethod(get);

当我在服务器上检查第二个请求的逻辑时,我注意到我们使用的是不同的JSESSIONID。因此,get似乎无法登录。我的印象是,httpClient管理了这些cookie,并将相同的cookie发送了回去。当我正常地通过UI登录我的应用程序时,我在每个请求中看到相同的cookie,只是在这个测试代码中没有

    String s = get.getResponseBodyAsString();
    get.releaseConnection();

我需要对httpClient做些什么来确保它在执行get请求时使用与第一次post请求相同的cookie吗

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    关于HTTP客户端cookie行为的假设是正确的。 在您的情况下,您不能使用相同的httpClient实例。要修复它,只需分配一次httpClient(在PostConstructor中):

           httpClient = new DefaultHttpClient(); // or new HttpClient();
    

    然后,使用同一个客户端实例执行调用。客户端将从响应中获取一个cookie,将其存储在cookieStore中,并将其与下一个请求一起发送

    [评论后添加] 以下代码适用于我:

        httpClient = new DefaultHttpClient();
        // Create a local instance of cookie store
        cookieStore = new BasicCookieStore();
        // Set the store
        httpClient.setCookieStore(cookieStore);