0

我需要一些帮助。我正在开发一个需要以 https html 表单登录的 Android 应用程序。几天前,表单不是https,而是http,我的代码是:

String sessionId = "";
    int TIMEOUT_MS = 10000; //10 segundos hasta la conexion

    //El POST
    HttpClient httpClient = new DefaultHttpClient();
    HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), TIMEOUT_MS);
    HttpConnectionParams.setSoTimeout(httpClient.getParams(), TIMEOUT_MS);
    //httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
    try {
    HttpPost httpPost = new HttpPost("http://" + servidor + ".pucp.edu.pe/login");

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);  
            nameValuePairs.add(new BasicNameValuePair("username", usuarioTxt));  
            nameValuePairs.add(new BasicNameValuePair("password", contrasenaTxt));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

        //POST request
        HttpResponse response = httpClient.execute(httpPost);
        //Obtenerlo en String
        sessionId = inputStreamToString(response.getEntity().getContent()).toString();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        //si no se llega a obtener la conexión
        //e.printStackTrace();
        AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setMessage(getResources().getString(R.string.errorDescarga));
        alertDialog.setButton("Ok", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int which) {
               }
            });
        alertDialog.show();
    }

return sessionId;

这是基于stackoverflow上的一些帖子。

现在,使用 https 表单,我遇到了一些问题。首先,每次你想登录时,服务器都会生成一个“执行代码”,所以我可以从一个简单的 html 文件登录,如下所示:

<html>
<form id="fm1" name="form" method="post" action="https://pandora.pucp.edu.pe/pucp/login?TARGET=http://eros.pucp.edu.pe/" >
<input type="text" name="username" value=""><br>
<input type="password" name="password" value=""><br>
<input type="hidden" name="lt" value="" />
<input type="hidden" name="execution" value="6A66F2A063BBB7D56ACC8B75FE90BB7E54300C800915F016B55B1A7B4B18DA0231F875DB909579CEC415A3FACDF98CB5" />
<input type="hidden" name="_eventId" value="submit" />      
<input type="submit" value="Ingresar">
</form>
</html>

name="execution" value=""用生成的on替换冗长乏味的96位十六进制字符https://pandora.pucp.edu.pe/pucp/login(查看浏览器上的网页源代码)

但我无法使用 Android 应用程序达到相同的点;即我无法登录:它返回一个 HTML 代码,上面写着“对不起,我们无法登录”。这很重要,因为连接不会被拒绝,而是被错误地接受。

One more thing:我注意到您需要启用 cookie,因为我尝试在禁用 Firefox 的情况下登录,而服务器只是返回了相同的登录表单。

同样,我可以通过浏览器登录 Android 模拟器。

所以,总而言之,我需要:

  • 在 https 网页上发布
  • 为 POST 提供用户名、密码、执行代码和其他“参数”,就像在 http 版本上工作的代码一样
  • 在应用程序上启用 cookie 以便服务器允许我登录

我已经在这里尝试了几乎数百个片段,但没有一个具有所有三个点(大多数只有一两个)。

先感谢您,

阿尔多

PS:抱歉,代码很长,描述可能很混乱。如果需要,请询问详细信息。

4

0 回答 0