【问题标题】:getting wrong jsession id获取错误的会话 ID
【发布时间】:2015-05-26 07:15:14
【问题描述】:

public static ApiFactory getInstance(String url, String userName, String password) {

            String sessionId = null;
            client = new DefaultHttpClient();
            ConstantUtil.setHostUrl(url);
            ConstantUtil.setUserName(userName);
            ConstantUtil.setPassword(password);

            try {
                    request = new HttpGet(ConstantUtil.getLoginUrl());
                    response = client.execute(request);
                    final Header[] headers = response.getHeaders("Set-Cookie");
                    for (int i = 0; i < headers.length; i++) {
                            if (headers[i].toString().indexOf("JSESSIONID") > 0) {
                                    int start = headers[i].toString().indexOf("JSESSIONID");
                                    int end = headers[i].toString().indexOf(";");
                                    sessionId = headers[i].toString().substring(start, end);
                            }
                    }

                    ConstantUtil.setLoginJsessionId(sessionId);



            } catch (ClientProtocolException e) {
                    e.printStackTrace();
            } catch (IOException e) {
                    e.printStackTrace();
            } finally {
                    request.abort();
            }

无法获得认证 myloginUrl is... String loginurl = ConstantUtil.getHostUrl() + "/j_spring_security_check?j_user="+ getUserName() + "&j_passw=" + getPassword(); 实际上我需要 jsessionId,我需要它用于以后发布 json 数据时的目的。

【问题讨论】:

  • 会不会是你拿到后才设置的?到一个看起来可能不存在的无效常量?
  • 为什么错了??
  • 实际上这是工作代码。这是因为我手动设置会话 ID。但是我在这里得到的会话 ID 是 ConstantUtil.setLoginJsessionId(sessionId) 是错误的,这是因为我在做 ConstantUtil.setLoginJsessionId("JSESSIONID=mzJzfKOYfK1DKZr4Yiua5g**");

标签: java httpclient


【解决方案1】:

我认为您应该从 cookie 中获取 JSESSIONID,而不是以“神奇”的方式从标头中获取它。要做到这一点,DefaultHttpClient 有类似 getCookieStore() 的东西,而 CookieStoregetCookies() 方法。尝试使用它们。

编辑:广告评论

您错了,您的登录机制无法正常工作。如果您粘贴代表已登录用户会话的JSESSIONID,服务器可能会忽略登录请求并返回经过身份验证的内容。这称为会话劫持。 所以你需要仔细检查登录机制。

【讨论】:

  • 列表 cookies = client.getCookieStore().getCookies(); System.out.println(cookies);
  • 列表 cookies = client.getCookieStore().getCookies(); System.out.println(cookies);我正在获取 jsession id 但无法登录。以获得正确的 jsessionid 。首先我登录我的服务器,然后我从那里获取 jsessionid。第二件事是直到我登录 jsession 的时间应该是相同的,因为我在发布数据时也在发送这个 ID。但在这种情况下,每次我刷新我的 java 程序时,我都会得到新的 jsession id...请帮助
【解决方案2】:

正如 Antoniosss 所说,最好使用标准的 cookie 处理方法。话虽如此,您的方式可能应该让您获得 cookie,因为毕竟它们是以标头的形式发送的。

但是,我确实发现您的代码存在潜在问题。您测试 JSESSIONID 的索引是否大于 0。但如果 JSESSIONID 位于标头字符串的开头,那么它的索引将为 0,您会错过。您应该测试 JSESSIONID 的索引是否大于 -1。

【讨论】:

  • 我发现我无法正确获得身份验证。我的登录 url 包含 String url = ConstantUtil.getHostUrl() + "/j_spring_security_check?j_name=" + ConstantUtil.getUserName() + " &j_pass=" + ConstantUtil.getPassword();
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
相关资源
最近更新 更多