2010-12-07 8 views
0

私はこのプログラムをPythonで書いていますが、httpsを使用してウェブサイトにログインし、情報を取得してログアウトしました。 プログラムは非常に簡単だった:HttpsURLConnectionとPOST

class Richiesta(object): 

def __init__(self,url,data): 
    self.url = url 
    self.data = "" 
    self.content = "" 
    for k, v in data.iteritems(): 
     self.data += str(k)+"="+str(v)+"&" 
    if(self.data == ""): 
     self.req = urllib2.Request(self.url) 
    else: 
     self.req = urllib2.Request(self.url,self.data) 
    self.req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 5.1; rv:2.0b6) Gecko/20100101 Firefox/4.0b6') 
    self.req.add_header('Referer', baseurl+'/www/') 
    self.req.add_header('Cookie', cookie) 

def leggi(self): 
    while(self.content == ""): 
     try: 
      r = urllib2.urlopen(self.req) 
     except urllib2.HTTPError, e: 
      print("Errore del server, nuovo tentativo tra 15 secondi") 
      time.sleep(15)     
     except urllib2.URLError, e: 
      print("Problema di rete, proverò a riconnettermi tra 20 secondi") 
      time.sleep(20) 
     else: 
       self.content = r.read().decode('utf-8') 
def login(username,password): 
    global cookie 
    print("Inizio la procedura di login") 
    url = "https://example.com/auth/Authenticate" 
    data = {"login":"1","username":username,"password":password} 
    f = Richiesta(url,data) 
    f.leggi() 

さて、何らかの理由で、私はJavaでそれを翻訳する必要があります。

import java.net.*; 
import java.security.Security.*; 
import java.io.*; 
import javax.net.ssl.*; 

public class SafeReq { 
    String baseurl = "http://www.example.com"; 
    String useragent = "Mozilla/5.0 (Windows NT 5.1; rv:2.0b6) Gecko/20100101 Firefox/4.0b6"; 
    String content = ""; 

    public SafeReq(String s, String sid, String data) throws MalformedURLException { 
     try{ 
      URL url = new URL(s); 
      HttpsURLConnection request = (HttpsURLConnection) url.openConnection(); 

      request.setUseCaches(false); 
      request.setDoOutput(true); 
      request.setDoInput(true); 

      request.setFollowRedirects(true); 
      request.setInstanceFollowRedirects(true); 

      request.setRequestProperty("User-Agent",useragent); 
      request.setRequestProperty("Referer","http://www.example.com/www/"); 
      request.setRequestProperty("Cookie","sid="+sid); 
      request.setRequestProperty("Origin","http://www.example.com"); 
      request.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
      request.setRequestProperty("Content-length",String.valueOf(data.length())); 

      request.setRequestMethod("POST"); 
      OutputStreamWriter post = new OutputStreamWriter(request.getOutputStream()); 
      post.write(data); 
      post.flush(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream())); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null) { 
       content += inputLine; 
      } 
      post.close(); 
      in.close(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    public String leggi(){ 
     return content; 
    } 
} 

問題はログインが動作しない、である、と私はログインするために私を必要とするページを取得しようとすると、私は再び」ログインを得る:それまでは今、これは私がで書かきたものです"メッセージ。 2つのクラスは全く同じように見えますが、なぜ私は2番目のクラスを動作させることができないのか理解できません。

答えて

1

sidはどこから届きますか?症状から、私はあなたのセッションクッキーがサーバに正しく渡されないと思います。

可能な解決策については、この質問を参照してください:Cookies turned off with Java URLConnection。一般的に

、私は、JavaでHTTPの会話を実装するための使用HttpClient(シンプルなワンタイムGETやPOSTより複雑もの)にあなたをお勧めします。 code examplesを参照してください(私は "フォームベースのログオン"あなたのケースでは適切です)。

+0

私は自分自身で問題を解決しました。問題は、request.setFollowRedirects(); httpurlconnectionにリダイレクトを強制するが、クッキーを送信することは忘れないでください。 followredirectsをfalseに設定し、Locationヘッダーを取得して、2番目のリクエストを行いました。そして、これは魅力のように動作します:) – kaharas

0

今後これをお探しの方はHtmlUnitをご覧ください。 このanswerには良い例があります。