3

我在登录一个用 asp 制作的网站时遇到问题......这是我正在使用的代码:

public class MainActivity extends Activity {
Button bottone;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bottone = (Button) findViewById(R.id.button1);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = 
                    new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            }
        bottone.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // starting new Async Task
                try {
                    login();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    public static void login() throws IOException
    {
        String loginurl = "https://www.blurum.it/Web/", user, pass;
        user = "tester55";
        pass = "provapassword321";

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(loginurl);

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
        nameValuePairs.add(new BasicNameValuePair("ctrl_LoginControl$loginView$c01$RPLogin$LoginView$Username", user));
        nameValuePairs.add(new BasicNameValuePair("ctrl_LoginControl$loginView$c01$RPLogin$LoginView$Password", pass));
        nameValuePairs.add(new BasicNameValuePair("remember", "on"));
        nameValuePairs.add(new BasicNameValuePair("ctrl_LoginControl$loginView$c01$RPLogin$LoginView$LoginButton", "Accedi"));



        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request 
        HttpResponse response = httpClient.execute(httpPost);
        Log.d("logggd", "response stat code " + response.getStatusLine().getStatusCode());

        if (response.getStatusLine().getStatusCode() < 400) {

            String cookie = response.getFirstHeader("Cookie")
                    .getValue();
            Log.d("logggdc", "cookie: " + cookie);

            // get the contacts page 
            HttpGet getContacts = new HttpGet("https://www.blurum.it/Web/default.aspx");
            getContacts.setHeader("Cookie", cookie);
            response = httpClient.execute(getContacts);

            InputStream ins = response.getEntity().getContent();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    ins));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                Log.d("logggd1", " " + inputLine);
            }

            in.close();
        } else {
                Log.d("logggd2", "Response error: "
                        + response.getStatusLine().getStatusCode());
            }
        }
    }

但是我的应用程序崩溃了,所以我在代码中找不到错误......这是logcat:

    11-12 20:05:37.678: W/dalvikvm(1806): threadid=1: thread exiting with uncaught exception (group=0xb4177180)
11-12 20:05:37.688: E/AndroidRuntime(1806): FATAL EXCEPTION: main
11-12 20:05:37.688: E/AndroidRuntime(1806): java.lang.NullPointerException
11-12 20:05:37.688: E/AndroidRuntime(1806):     at com.example.testlogin.MainActivity.login(MainActivity.java:93)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at com.example.testlogin.MainActivity$1.onClick(MainActivity.java:53)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.view.View.performClick(View.java:3511)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.view.View$PerformClick.run(View.java:14105)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.os.Handler.handleCallback(Handler.java:605)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.os.Looper.loop(Looper.java:137)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at android.app.ActivityThread.main(ActivityThread.java:4424)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at java.lang.reflect.Method.invoke(Method.java:511)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-12 20:05:37.688: E/AndroidRuntime(1806):     at dalvik.system.NativeStart.main(Native Method)
11-12 20:05:38.218: I/dalvikvm(1806): threadid=3: reacting to signal 3
11-12 20:05:38.228: I/dalvikvm(1806): Wrote stack traces to '/data/anr/traces.txt'

我使用 Tamper Data 在 Firefox 中将发布的数据提取到服务器,这是一个屏幕,我认为登录分为 2 个帖子,这里是屏幕:http: //i.stack.imgur.com/GZiZ0.png http ://i.stack.imgur.com/FKH3P.png

我不确定我是否必须发送第一页或第二个帖子数据,这可能是错误吗?谢谢。

4

2 回答 2

1

似乎 response.getFirstHeader("Cookie")正在回归null

根据javadoc

返回具有此消息的指定名称的第一个标头。标题值被忽略。如果消息中有多个匹配的标头,则返回 getHeaders(String) 的第一个元素。如果消息中没有匹配的标头,则返回 null

解决方案:

null打电话前做个检查getValue();

例子:

String cookie = null;
if(response.getFirstHeader("Cookie") != null)
{
cookie = response.getFirstHeader("Cookie")
                    .getValue();
}
于 2012-11-12T20:53:20.340 回答
1

您不能在代码块中多次调用以下行;

response.getStatusLine()

您在看起来像这样的行中不止一次调用它;

Log.d("logggd", "response stat code " + response.getStatusLine().getStatusCode());

然后你在这条线上再次调用它;

if (response.getStatusLine().getStatusCode() < 400) {

注释掉第一次调用response.getStatusLine()- 那是您尝试记录状态代码的地方。所以你的代码应该是这样的;

//Log.d("logggd", "response stat code " + response.getStatusLine().getStatusCode());

您还想尝试在您的方法中的某个地方执行此操作,称为login();

    // Execute HTTP Post Request 
    HttpResponse response = httpClient.execute(httpPost);
    StatusLine statusLine = response.getStatusLine();

    Log.d("logggd", "response stat code " + statusLine.getStatusCode());


    if (statusLine.getStatusCode() < 400) {

         String cookie = null;
          if(response.getFirstHeader("Cookie") != null){
                 cookie = response.getFirstHeader("Cookie").getValue();
          }
          Log.d("logggdc", "cookie: " + cookie);

    //...etc....etc...etc
于 2012-11-12T20:56:32.267 回答