2012-03-18 9 views
-1

私は、httpsプロトコルを使用して自動的にウェブサイトにログインするJavaプログラムを作成しようとしています。私はちょうど私のプログラムに私の名前とパスワードを入力し、ヒット提出し、私がブラウザでそれを行う場合、表示されるページを取得したい。JavaでHTTPSウェブサイトにログイン

私は既に、SSLSocketクラスを使用してサイトのhtmlコードを表示するプログラムを作成しました。

import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.util.Scanner; 

import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 

public class bankpost{ 
    public static void main(String[] args) throws UnsupportedEncodingException { 
    final String page = "banking.postbank.de"; 
    SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    try { 
     SSLSocket s = (SSLSocket) sf.createSocket(page, 443); 

     Scanner in = new Scanner(s.getInputStream()); 
     PrintWriter out = new PrintWriter(s.getOutputStream(), true); 

     System.out.println("Sending request to server " 
       + s.getInetAddress()); 
     out.print("POST /rai/login HTTP1.1\r\n\r\n"); 
     String content = "nutzername=a&kennwort=a"; 
     String cmd = "POST /rai/login HTTP/1.1\n" 
       + "Host: banking.postbank.de\n" 
       + "Content-Type: application/x-www-form-urlencoded\n" 
       + "Content-Length: " + content.length() + "\n\n" 
       + content + "\r\n\r\n"; 
     out.print(cmd); 
     out.flush(); 
     in.useDelimiter(">"); 
     System.out.println("Reading..."); 
     int len = 0; 
     while (in.hasNext()) { 
      String line = in.next(); 
      len += line.length(); 
      if (line.contains("field-input") || line.contains("nicht")) 
       System.err.println(line.trim()); 
      else 
       System.out.println(line.trim()); 
     } 

     System.out.println("DONE - " + len); 
     System.out.print(cmd); 
     in.close(); 
     out.close(); 
     s.close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

...私が入力したいフィールドは「nutzername」と「kennwort」です。

私はここで間違っていますか?

+1

このコードを実行した後に何が起こったのかを教えてくれなかったので、何を間違えているのか分かりません。スタックトレースのような詳細を提供できますか? – home

+0

あああああ:S nutzername = a kennwort = aは有効なログインではありません。ブラウザでそれを行うと、メッセージが表示されます、そのパスワードは間違っています。私のプログラマーはそのメッセージを印刷しませんが、 "post"を "get"と置き換えた場合とまったく同じテキストです。 – Beginner

+0

Postbankがうまくやったのであれば、 – Wolfgang

答えて

0

標準的なHttpsConnectionの魔法を試してみます。 SSLでは、証明書とトラストマネージャを適切に設定する必要があります。このようHttpsContextを初期化します。検証はのHostnameVerifierインタフェースを実装descentantクラスであり、あなたが作業しているサイトのURLを受け入れ

SSLContext sc = SSLContext.getInstance("SSL"); 
    // here you may want to call sc.init() with your key managers and trustmanagers 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    HttpsURLConnection.setDefaultHostnameVerifier(verifier); 
    HttpsURLConnection.setFollowRedirects(false); 

    //setting authenticator which will push your credentials to the server when required 
    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(config.getUserName(), config.getPassword().toCharArray()); 
     } 
    }) 

コンテキストがすべて設定された後、他の単純なhttpサイトと同様に、新しいURL()。getConnection()を使用するだけで作業できます。

+0

HttpsURLConnectionを使用せずに別の方法はありませんか? – Beginner

関連する問題