1

私のプログラムは学生のユーザー名とパスワードを要求し、ログインに成功すると、メイン ページの HTML ソース コードから学生の写真と名前を取得し、別のインテントまたはアクティビティに表示します。

うまくいっていますが、別のページの HTML ソース コードを表示したいのですが、方法がわかりません。別のページにアクセスするために別の httpclient または httpost を作成するたびに、既にログインしている場合でも、ログイン ページのソース コードが表示されます。

これはメインコードです:

public class TestingActivity extends Activity implements OnClickListener {
  String uname, pass, pic;
  EditText txtUname, txtPass;
  Button login;
  TextView result, tview2, tview3;
  String nameStartLine = " <td style=\"font:10px verdana; color:#312e25; text-align:right;\">Name:</td>";
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    login=(Button)findViewById(R.id.button1);
    result=(TextView)findViewById(R.id.textView1);
    tview2=(TextView)findViewById(R.id.textView2);
    tview3=(TextView)findViewById(R.id.textView3);
    txtUname=(EditText)findViewById(R.id.editText1);
    txtPass=(EditText)findViewById(R.id.editText2);

    login.setOnClickListener(this);
  }
  public void postLoginData() {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://students.usls.edu.ph/login.cfm");
    try {
      String username = txtUname.getText().toString();
      String password = txtPass.getText().toString();
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
      nameValuePairs.add(new BasicNameValuePair("username",username));
      nameValuePairs.add(new BasicNameValuePair("password",password));
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
      HttpResponse response = httpclient.execute(httppost);
      String str = inputStreamToString(response.getEntity().getContent()).toString();
      result.setText(str);
      Intent intent = new Intent(TestingActivity.this,panel_1.class);
      intent.putExtra("result",result.getText());
      pic = "http://teachers.usls.edu.ph/student_pics/" + txtUname.getText() + ".jpg";
      intent.putExtra("pic",pic);
      startActivity(intent);
    }
    catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  private StringBuilder inputStreamToString(InputStream is) {
    String line = "";
    StringBuilder total = new StringBuilder();
    // Wrap a BufferedReader around the InputStream
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    // Read response until the end
    try{
      while ((line = rd.readLine()) != null) {
        if (line.equals(nameStartLine)) {
          line = rd.readLine();
          StringTokenizer st = new StringTokenizer(line, ">< ");
          String marker = st.nextToken();
          while(st.hasMoreTokens()) {
            if(marker.equals("strong")) {
              marker = st.nextToken();
              while(!(marker.equals("/strong"))) {
                total.append(marker + " ");
                marker = st.nextToken();
              }
            }
            marker = st.nextToken();
          }
        }
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    // Return full string
    return total;
  }
  public void onClick(View view) {
    if(view == login){ postLoginData(); }
  }
}

2 つ目のアクティビティは次のとおりです。

public class panel_1 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main2);
    TextView result = (TextView)findViewById(R.id.txtresult);
    result.setText(""+getIntent().getExtras().getString("result"));
    //set position
    WebView myWebView = (WebView) findViewById(R.id.webView1);
    myWebView.loadUrl(getIntent().getExtras().getString("pic"));
  }
}

ご覧のとおり、プログラムはパラメータを に渡しましたhttp://students.usls.edu.ph/login.cfm。ログインに成功すると、メイン ページの HTML ソース コードが取得され、学生の名前と写真が表示されます。では、プログラムをこのリンクにリダイレクトして HTML ソース コードを表示し、そこから重要なデータを取得するにはどうすればよいでしょうか? 再度使用してみhttpclientましたが、ログインページの HTML ソースコードが表示されたり、http://students.usls.edu.ph/login.cfm既にログインしているのに表示されたりします。

4

2 に答える 2

0

私はそれを解決したと思います。http://students.usls.edu.ph/login.cfmでのログインに成功した後、このように Cookie を取得しました

   List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
             if (cookies.isEmpty()) {
                Log.d("ERROR","no cookies received");
             } 
             else {
                for (int i = 0; i < cookies.size(); i++) {
                    if(cookies.get(i).getName().contentEquals("CFID")) {
                         CFID = cookies.get(i).getValue();
                     }
                    else if(cookies.get(i).getName().contentEquals("CFTOKEN")) {
                         CFTOKEN = cookies.get(i).getValue();
                     }

                }
             }

次に、このリンクhttp://students.usls.edu.ph/modules/modules.class_schedule.cfmを使用して別の httppost を呼び出し、ソース コードを表示しました。

             HttpPost httppost2 = new HttpPost("http://students.usls.edu.ph/modules/modules.class_schedule.cfm");
             List<NameValuePair> nameValuePairs2 = new ArrayList<NameValuePair>(2);
             nameValuePairs2.add(new BasicNameValuePair("CFID",CFID));
             nameValuePairs2.add(new BasicNameValuePair("CFTOKEN",CFTOKEN));
             httppost2.setEntity(new UrlEncodedFormEntity(nameValuePairs2));

最後に、 http://students.usls.edu.ph/modules/modules.class_schedule.cfmのソースコードを表示することができました。

于 2012-08-21T12:00:25.390 に答える
0

2 番目のアクティビティでは、サーバーに対してすべての新しい要求を行っていますが、サーバーは認証資格情報を認識していないため、ログイン ページが返されます。したがって、 2 番目のリクエストでもusernameandを渡す必要があります。password

postUrlを使用する必要があります

たとえば。

String url = getIntent().getExtras().getString("pic");
String postData = username=my_username&password=my_password;
webview.postUrl(url,EncodingUtils.getBytes(postData, "BASE64"));

最初のアクティビティの次の場所でコードが間違っていると思います

intent.putExtra("result",result.getText()); // result.getText().toString();
pic = "http://teachers.usls.edu.ph/student_pics/" + txtUname.getText() + ".jpg"; // txtUname.getText().toString();

そして、いくつかの高度な機能にはWebViewClientを使用することをお勧めします。

于 2012-08-21T10:36:01.983 に答える