使用 SpringFramework RestTemplate 的 ALM 12 REST:“401 QCSession cookie 丢失”
ALM 12 REST using SpringFramework RestTemplate: "401 QCSession cookie missing"
在 ALM 12 中,我们必须显式调用 "qcbin/rest/site-session" 来获取会话。
当我 GET 调用“/qcbin/rest/site-session”时,我收到以下信息:
"Set-Cookie=[BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080; path=/, ]""
我按照此处所述提取 cookie:
HP ALM 12 REST not returning QCSession cookie。
我们的项目使用 SpringFramework 中的 RestTemplate 而不是这个 RestConnector,所以我做了:
private HashMap getQCSession() throws Exception {
URL url = new URL("https://almxxxx.saas.hp.com/qcbin/rest/site-session?login-form-required=y");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setRequestProperty("Accept", "application/xml");
conn.connect();
HashMap cookies = updateCookies(conn);
return cookies;
}
public HashMap updateCookies(HttpURLConnection conn) {
String cookie2 = conn.getHeaderField("Set-Cookie");
int equalIndex = cookie2.indexOf('=');
int semicolonIndex = cookie2.indexOf(';');
String cookieKey = cookie2.substring(0, equalIndex);
String cookieValue = cookie2.substring(equalIndex + 1, semicolonIndex);
HashMap cookies = new HashMap();
cookies.put(cookieKey, cookieValue);
System.out.println(cookies.toString());
return cookies;
}
为了使用 RestTemplate 在 GET 调用中发送 cookie,我遵循了 http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate/ 中的说明,所以我做到了:
public <U extends Object> ResponseEntity<U> getFromURL(URI url, Class<U> responseBodyClass) throws Exception {
logger.info("GET na URL: {} esperando classe: {} no response", url, responseBodyClass);
HashMap cookie = this.getQCSession();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", this.getQCSession().toString());
this.httpEntity = new HttpEntity(null, requestHeaders);
return super.exchange(url, HttpMethod.GET, this.httpEntity, responseBodyClass);
}
HttpEntity(SpringFramework)中添加的requestHeaders内容为:
{Cookie=[{BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080}]}
但是我仍然收到“401 QCSession cookie 丢失”。
我已经尝试在 GET 调用中发送 JSESSIONID,但也没有成功。
我感谢任何帮助。
有什么线索吗?
我运行进入这个。从 ALM12 开始,您还需要创建一个 session。
我POST一些XML或JSON到这里“/authentication-point/alm-authenticate”进行验证
然后收集 Set-Cookie header
然后我 POST 到“/rest/site-session” 与来自先前响应的 cookie。
我从该响应中收集了 session 个 cookie,以便在我的后续请求中使用。
希望对您有所帮助
我不知道,如果它可以帮助你,但你发送它时带有用于 UI 身份验证的查询参数。
"POST .../rest/site-session?login-form-required=y"
我建议POST它没有查询参数
"POST .../rest/site-session"
此外,在请求 QCSession 令牌之前您应该执行的操作顺序是:
1.Check是否通过认证
"GET .../rest/is-authenticated"
2.If 不是你会得到验证位置的参考:WWW-Authenticate: LWSSO realm=".../authentication-point"
3.Send 基本身份验证 header 到最后添加 alm-authenticate 的身份验证点。 return 你 LWSSO_COOKIE_KEY.
"POST .../authentication-point/alm-authenticate"
Authentication: Basic BASE64{username:password}
4.Then 您需要 POST LWSSO_COOKIE_KEY 到 site-session 并且 ALM 将 return 您的 QCSession 密钥。
"POST .../rest/site-session"
"Cookie: LWSSO_COOKIE_KEY={cookie}; Path=/"
希望我能帮到你。
如果您还有问题,请随时与我联系。
在 ALM 12 中,我们必须显式调用 "qcbin/rest/site-session" 来获取会话。 当我 GET 调用“/qcbin/rest/site-session”时,我收到以下信息:
"Set-Cookie=[BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080; path=/, ]""
我按照此处所述提取 cookie: HP ALM 12 REST not returning QCSession cookie。 我们的项目使用 SpringFramework 中的 RestTemplate 而不是这个 RestConnector,所以我做了:
private HashMap getQCSession() throws Exception {
URL url = new URL("https://almxxxx.saas.hp.com/qcbin/rest/site-session?login-form-required=y");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setRequestProperty("Accept", "application/xml");
conn.connect();
HashMap cookies = updateCookies(conn);
return cookies;
}
public HashMap updateCookies(HttpURLConnection conn) {
String cookie2 = conn.getHeaderField("Set-Cookie");
int equalIndex = cookie2.indexOf('=');
int semicolonIndex = cookie2.indexOf(';');
String cookieKey = cookie2.substring(0, equalIndex);
String cookieValue = cookie2.substring(equalIndex + 1, semicolonIndex);
HashMap cookies = new HashMap();
cookies.put(cookieKey, cookieValue);
System.out.println(cookies.toString());
return cookies;
}
为了使用 RestTemplate 在 GET 调用中发送 cookie,我遵循了 http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate/ 中的说明,所以我做到了:
public <U extends Object> ResponseEntity<U> getFromURL(URI url, Class<U> responseBodyClass) throws Exception {
logger.info("GET na URL: {} esperando classe: {} no response", url, responseBodyClass);
HashMap cookie = this.getQCSession();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", this.getQCSession().toString());
this.httpEntity = new HttpEntity(null, requestHeaders);
return super.exchange(url, HttpMethod.GET, this.httpEntity, responseBodyClass);
}
HttpEntity(SpringFramework)中添加的requestHeaders内容为:
{Cookie=[{BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080}]}
但是我仍然收到“401 QCSession cookie 丢失”。
我已经尝试在 GET 调用中发送 JSESSIONID,但也没有成功。
我感谢任何帮助。 有什么线索吗?
我运行进入这个。从 ALM12 开始,您还需要创建一个 session。
我POST一些XML或JSON到这里“/authentication-point/alm-authenticate”进行验证
然后收集 Set-Cookie header
然后我 POST 到“/rest/site-session” 与来自先前响应的 cookie。
我从该响应中收集了 session 个 cookie,以便在我的后续请求中使用。
希望对您有所帮助
我不知道,如果它可以帮助你,但你发送它时带有用于 UI 身份验证的查询参数。
"POST .../rest/site-session?login-form-required=y"
我建议POST它没有查询参数
"POST .../rest/site-session"
此外,在请求 QCSession 令牌之前您应该执行的操作顺序是:
1.Check是否通过认证
"GET .../rest/is-authenticated"
2.If 不是你会得到验证位置的参考:WWW-Authenticate: LWSSO realm=".../authentication-point"
3.Send 基本身份验证 header 到最后添加 alm-authenticate 的身份验证点。 return 你 LWSSO_COOKIE_KEY.
"POST .../authentication-point/alm-authenticate"
Authentication: Basic BASE64{username:password}
4.Then 您需要 POST LWSSO_COOKIE_KEY 到 site-session 并且 ALM 将 return 您的 QCSession 密钥。
"POST .../rest/site-session"
"Cookie: LWSSO_COOKIE_KEY={cookie}; Path=/"
希望我能帮到你。 如果您还有问题,请随时与我联系。