从Java VM调用cookie设置REST服务时,cookie如何工作?

时间:2015-03-19 15:19:45

标签: java eclipse rest authentication cookies

我正在学习如何使用HP Quality Center的REST api来查询和操作数据。与REST标准不同,此API不是完全无状态的。它使用cookie来存储身份验证会话。

我尝试使用Jersey Client库实现一个非常简单的测试。我可以通过发送凭据成功验证我的用户身份。 API参考声称这将设置一个cookie,我很高兴进一步调用REST api。但是,一个简单的“已验证”调用将返回401,验证失败。

我感觉cookie编写或阅读工作不正常,因为其他一切似乎都应该正常工作。但是,当没有涉及浏览器时,我无法确定是否或如何设置和读取cookie。那么当从Java VM调用cookie设置REST服务时,cookie如何工作?它有用吗?它们存放在哪里?

我正在使用Eclipse Kepler作为我的IDE,如果这很重要,那么32位java 1.6 JDK和JRE。

以下代码和响应字符串:

1。登录:

    Client client = ClientBuilder.newClient();
    Response response = client
            .target("http://[host]:[port]").path("qcbin/authentication-
             point/alm-authenticate")
            .request().post(Entity.entity("<alm-authentication>
             <user>username</user>
             <password>secret</password></alm-authentication>",
             MediaType.TEXT_XML_TYPE));

    System.out.println(response.toString());

输出:

InboundJaxrsResponse{ClientResponse{method=POST, 
    uri=http://[host]:[port]/qcbin/authentication-point/alm-authenticate,
    status=200, reason=OK}}

API返回说明:

  

其中一个:

     

HTTP代码200并设置LWSSO cookie(LWSSO_COOKIE_KEY)。

     

用于未经身份验证的请求的HTTP代码401。发送标题   WWW-Authenticate:ALMAUTH




2。验证已登录:

response = client.target("http://[host]:[port]")
     .path("qcbin/rest/is-authenticated")
      .request().get();

System.out.println(response.toString());

输出:

InboundJaxrsResponse{ClientResponse{method=GET,     
    uri=http://[host]:[port]/rest/is-authenticated, status=401,   
    reason=Authentication failed. Browser based integrations - to login append 
    '?login-form-required=y to the url you tried to access.}}

PS:?login-form-required=y添加到网址,会在浏览器中调用时显示登录窗口,但不在此处。将该行附加到URL实际上仍会提供相同的错误消息,并建议再次附加它。此外,在浏览器中调用时,即使没有登录表单,is-authenticated也会返回200,即使没有登录表单。

1 个答案:

答案 0 :(得分:1)

当您登录时,您将获得一个名称加值的cookie。

REST服务器希望您在请求标头中将其与您发出的每个请求一起传递。

查看client.request()获得的对象;应该有一种方法来指定要发送到服务器的其他标头。标头名称必须为Cookie,标头值必须为name=value

因此,如果服务器使用名为sessionID且值为1234的Cookie进行响应,那么您需要以下内容:

client.request().header("Cookie", "sessionID=1234")

相关: