java - 使用android登录网站

标签 java android cookies https

基本上,我使用 firefox 扩展来获取帖子并从登录到我的学校网站获取数据。我希望能够登录,但是当我尝试时它说“ session 已过期请重新登录!”。这是我到目前为止的代码,谁能告诉我我做错了什么?我认为这与重定向有关,因为第一篇文章应该重定向到正确的位置,但我无法让它工作,并且尝试获取位置 header 会抛出一个空指针。

try {
            super.onCreate(icicle);
            CookieManager cookieManager = new CookieManager();
            CookieHandler.setDefault(cookieManager);
            BasicClientCookie netscapeCookie = new BasicClientCookie("UserLoginInfo", "SelectedTab=StudentLogin&RedirectURL=");
            netscapeCookie.setVersion(0);
            netscapeCookie.setDomain("sisk12.hannibal.k12.mo.us");
            netscapeCookie.setPath("/");
            cookieStore.addCookie(netscapeCookie);
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
            HttpPost httpost = new HttpPost("https://sisk12.hannibal.k12.mo.us/hb/Default.aspx?__EVENTTARGET=&__EVENTARGUMENT=&txtUserName=xxxx&txtPassword=xxxxxx&btnLogin=Login&txtSelectedTab=StudentLogin");
            HttpResponse response = httpclient.execute(httpost, localContext);
            HttpEntity entity = response.getEntity();
            // readResponse(response.getEntity().getContent());
            //Log.w("****","Login form get: " + response.getFirstHeader("Location").getValue());
            // readResponse(response.getEntity().getContent());
            if (entity != null) {
                entity.consumeContent();
            }
            Header[] headers = response.getHeaders("Location");
            if (headers != null && headers.length != 0) {
                String newUrl = headers[headers.length - 1].getValue();
                // call again with new URL
                HttpGet httpget = new HttpGet(newUrl);
                entity = response.getEntity();
                Log.w("****", "Login form get: " + response.getStatusLine());
                response = httpclient.execute(httpget, localContext);
                readResponse(response.getEntity().getContent());
            } else {
                Log.w("****", "No location header");
            }
            if (cookieStore.getCookies().isEmpty()) {
                Log.w("****", "None");
            } else {
                for (int i = 0; i < cookieStore.getCookies().size(); i++) {
                    Log.w("****", "- " + cookieStore.getCookies().get(i).toString());
                }
            }
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        } catch (IOException ex) {
            Log.e("****", Log.getStackTraceString(ex));
        }

public String readResponse(InputStream input) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(input));
    StringBuilder sb = new StringBuilder("");
    String line = "";
    String NL = System.getProperty("line.separator");

    while ((line = in.readLine()) != null) {
        sb.append(line).append(NL);
    }

    in.close();

    String page = sb.toString();
    Log.i("****", page);

    return page;
}

更新

我更改了我的代码并得到了这个响应 - 发生了以下错误

错误信息:HTTP 请求开始失败! 技术信息:线程被中止。 调用栈:_pvt_ApplicationBeginRequest参数列表:

我的代码是

        static String regex ="name=\"__VIEWSTATE\" value=\"";
        String getURL = "https://sisk12.hannibal.k12.mo.us/hb/Default.aspx";
        String postURL = getURL;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet getMethod = new HttpGet(getURL);
        HttpResponse response = client.execute(getMethod, localContext);
        String getString=readResponse(response.getEntity().getContent());

        int start = getString.indexOf(regex)+regex.length();
        String viewState = getString.substring(start, getString.indexOf('"', start+1));

        Log.i("****", viewState);

        HttpPost postMethod = new HttpPost(postURL);
        postMethod.addHeader("__EVENTARGUMENT", "");
        postMethod.addHeader("__EVENTTARGET", "");
        postMethod.addHeader("__VIEWSTATE", viewState); //to be parsed from login page
        postMethod.addHeader("btnLogin", "Login");
        postMethod.addHeader("txtPassword", "xxxxxx");
        postMethod.addHeader("txtSelectedTab", "StudentLogin");
        postMethod.addHeader("txtUserName", "xxxx");

        HttpResponse postResponse = client.execute(postMethod, localContext);
        String postString = readResponse(postResponse.getEntity().getContent());
        Log.w("****", postString);

        HttpGet getGrades = new  HttpGet("https://sisk12.hannibal.k12.mo.us/hb/Portal/Parent/ParentLogin.aspx");
        HttpResponse response2 = client.execute(getGrades, localContext);
        String getGradesString=readResponse(response2.getEntity().getContent());
        Log.i("****", getGradesString);

代码中有一个应该由帖子调用的重定向,但我不知道 apache 是否会自动处理这个问题,如果没有如何处理这个问题?

最佳答案

这可能与 ASP.NET session cookie 有关。

当您在浏览器 (https://sisk12.hannibal.k12.mo.us/hb/Default.aspx) 中加载登录页面时,它会设置一个 session cookie,ASP.NET_SessionId。当在浏览器中单击登录按钮时,将提交该 cookie。

但您的代码并未提交此类 cookie。如果你做这样的事情也许会奏效:

  1. 加载Default.aspx
  2. 从该请求中提取 ASP.NET_SessionId cookie
  3. 然后运行您的原始代码,但也要添加 session cookie

关于java - 使用android登录网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376203/

相关文章:

Java大富翁游戏

java - 为什么代码在 LIBGDX 中的 setScreen() 之后运行?

android - 使用 artifactory-publish 和 maven-publish 将 apk 发布到 Artifactory

java - 从 Java 进程执行时跳过批处理文件中的暂停命令

java - 如何解决此错误 "Type mismatch: cannot convert from List<String> to Iterator<String>"

Android Nougat 多窗口 minHeight

android - BCM4339 的 Nexus 5 无线驱动程序

ios - 如何在 SWIFT 3 或 4 中的 REST API 调用期间安全地处理 cookie?

javascript - 在 Flask 与 JS 中设置 cookie

javascript - 这是处理 ember 返回用户的安全方法吗?