2013-10-23 47 views
0

我正在创建一个登录应用程序,以从代码中显示的链接中检索一些信息。我的问题是,我得到一个“400错误的请求,你的浏览器发送了一个请求,这个服务器无法理解。[...]服务器在idp.tut.fi端口443”在日志文件中。您的浏览器发出请求,此服务器无法理解HttpsURLConnection

此外,该链接处理RC4_128与SHA1进行身份验证和密钥交换的RSA,但并不真正知道我可以在我的代码中应用这些协议的位置。

感谢您的帮助!

这是我的代码:

public class POPLogin extends Activity { 

private EditText usr, pass; 
private Button submitButton; 
private CharSequence notify; 
private String res, resp; 
private final String link = "https://idp.tut.fi/idp/Authn/UserPassword"; 
private URL url; 

public static boolean isNetworkAvailable(Context context) { 
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null; 
} 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_poplogin); 
    usr = ((EditText) findViewById(R.id.usernameField));    
    pass = ((EditText) findViewById(R.id.passwordField));   
    submitButton = (Button) findViewById(R.id.submitButton);   
    submitButton.getBackground().setColorFilter(new LightingColorFilter(0x00FFB90F, 0xFFAA0000)); 

    /* 
    * This method controls the login button so that the correct 
    * information is sent to the server. 
    */ 
    submitButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if(isNetworkAvailable(getApplicationContext())) { // If there is an Internet connection available 

       /* 
       * A new thread is created from the main one 
       * to separate the login process (AsyncTask, https operations). 
       */ 
       new Thread(new Runnable() { 
        public void run() { 
         try { 
          url = new URL(link); 
          HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 

          // Create the SSL Connection 
          SSLContext sc; 
          sc = SSLContext.getInstance("TLS"); 
          sc.init(null, null, new java.security.SecureRandom()); 
          conn.setSSLSocketFactory(sc.getSocketFactory()); 

          // SSL Authentication 
          String userpass = usr.getText().toString() + ":" + pass.getText().toString(); 
          String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT); 
          conn.setRequestProperty("Authorization", basicAuth); 

          Log.i("NOTIFICATION", "All SSL parameters set"); 

          // Set timeout and method 
          conn.setReadTimeout(7000); 
          conn.setConnectTimeout(7000); 
          conn.setRequestMethod("POST"); 
          conn.setDoInput(true);   // Flag indicating this connection is used for output (POST) 
          conn.connect(); 

          Log.i("NOTIFICATION", "Connection request sent"); 

          // Check HTTP Response Code 
          int status = conn.getResponseCode(); 
          InputStream is; 
          if (status >= 400) { 
           is = conn.getErrorStream(); 
          } else { 
           is = conn.getInputStream(); 
          } 

          Log.i("NOTIFICATION", "HTTP Code Checked"); 

          // Receives the answer 
          resp = null; 
          BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
          while((res = rd.readLine()) != null) { 
           resp += res; 
          } 
          Log.i("NOTIFICATION", "Answer received"); 
          Log.i("CODE", resp); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }).start(); 
      } else { 
       notify = "Internet Connection not available"; 
      } 

      if(notify != null) { 
       Toast toast = Toast.makeText(getApplicationContext(), notify, Toast.LENGTH_SHORT); 
       toast.show(); 
       notify = null; 
      } 
     } 
    }); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.poplogin, menu); 
    return true; 
} 

}

回答

2

如果你有一个HTTP错误代码是证明您的HTTPS和SSL,因此安装工作完美。

问题出在您发送的数据上。它看起来像你需要使用一个java.net.Authenticator,而不是尝试手动完成。

+0

我会尝试使用authenticator包。谢谢你的提示 :-) – dgarciale

相关问题