使用SESSION ID或身份验证访问JSON

时间:2013-01-16 20:11:36

标签: java json authentication apache-httpclient-4.x jsessionid

我在Eclipse中创建了一个简单的Java项目(而不是动态Web项目)。

我希望能够访问返回一些JSON值的网址。

我可以使用HttpClient访问该网址,但我无法对我的会话进行身份验证,这是我访问JSON数据所必需的。如果您未经过身份验证,则会将您重定向到登录页面。

我已尝试过多种方式对我的会话进行身份验证但似乎没有办法 - 我总是最终获得登录页面的HTML数据而不是JSON。

我还注意到JSESSION ID已传递到请求标头,但我似乎无法弄清楚如何创建JSESSION ID以及如何将其传递给GET请求。

基本上,我可以用两种方式解决这个问题:

  1. 验证我的会话,然后访问URL以获取JSON
  2. 创建一个JSESSION ID并将其传递给GET请求以获取JSON
  3. 任何人都知道怎么做?

    最后,我想使用从JSON收集的数据来进行一些Selenium测试,所以我需要在动态Web项目(在Eclipse中)中完成所有这些操作,还是可以在常规Java项目?


    尝试1

    URL url = new URL(_url);
    
    InputStream ins = url.openConnection().getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
    StringBuilder builder = new StringBuilder();
    
    for (String line = null; (line = reader.readLine()) != null;) {
        builder.append(line).append("\n");
    }
    
    System.out.println("RESPONSE:\n\n" + builder);
    
    JSONTokener tokener = new JSONTokener(builder.toString());
    JSONArray finalResult = new JSONArray(tokener);
    
    System.out.println("JSON:\n\n" + finalResult.toString());
    

    尝试1结果

    我最终打印出登录页面的HTML代码,然后得到以下错误消息,因为页面上没有JSON:

    Exception in thread "main" org.json.JSONException: A JSONArray text must start with '[' at character 1
    

    尝试2

    我还尝试了Oracle's Http Authentication页面中的代码:

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.Authenticator;
    import java.net.PasswordAuthentication;
    import java.net.URL;
    
    public class RunHttpSpnego {
    
        static final String kuser = "username"; // your account name
        static final String kpass = "password"; // your password for the account
    
        static class MyAuthenticator extends Authenticator {
            public PasswordAuthentication getPasswordAuthentication() {
                // I haven't checked getRequestingScheme() here, since for NTLM
                // and Negotiate, the usrname and password are all the same.
                System.err.println("Feeding username and password for " + getRequestingScheme());
                return (new PasswordAuthentication(kuser, kpass.toCharArray()));
            }
        }
    
        public static void main(String[] args) throws Exception {
            Authenticator.setDefault(new MyAuthenticator());
            URL url = new URL(args[0]);
            InputStream ins = url.openConnection().getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
            String str;
            while((str = reader.readLine()) != null)
                System.out.println(str);
        }
    }
    

1 个答案:

答案 0 :(得分:1)

当您登录时,服务器会使用响应中的Set-Cookie标头将会话ID设置为浏览器中的cookie。

Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09-Jun-2021 10:18:14 GMT

然后,浏览器会在请求标头中为每个后续请求向服务器提供此cookie。

Cookie: name=value; name2=value2

HttpClient可以为您执行此管理,就像浏览器一样。见http://hc.apache.org/httpclient-3.x/cookies.html 那么你首先要告诉HttpClient浏览登录页面,它会获取你的cookie,并在随后的请求中发送它。

您也可以自己动手并手动设置cookie。在HttpClient 3中,这看起来像这样:

HttpMethod method = new GetMethod();
method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
method.setRequestHeader("Cookie", "special-cookie=value");

如何在HttpClient 4中设置cookie可以在这里找到:Apache HttpClient 4.0.3 - how do I set cookie with sessionID for POST request

或者你可以把它降低一点并添加完整的标题。

HttpGet httpget = new HttpGet(url); 
httpget.addHeader("Cookie", "JSESSIONID=...");