2010-12-07 33 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; 
    } 
} 

的問題是,登錄不工作,當我試圖讓那些需要我去登錄一個頁面,我得到了「重新登錄「 信息。 這兩個班似乎完全一樣,我不明白爲什麼我不能讓第二個工作......任何想法?

回答

1

你從哪裏得到sid?從症狀中,我猜想您的會話cookie沒有正確傳遞到服務器

看到這個問題的可能的解決方案:Cookies turned off with Java URLConnection

一般來說,我建議您使用使用HttpClient來實現Java中的HTTP會話(比簡單的一次性GET或POST更復雜)。請參閱code examples(我猜「基於窗體的登錄」示例適合您的情況)。

+0

我自己解決了這個問題。問題是,request.setFollowRedirects();強制httpurlconnection遵循重定向,但忘記發送cookie。我將followredirects設置爲false,取了Location標題,並提出了第二個請求。這就像一個魅力:) – kaharas 2010-12-07 13:32:10

0

任何人在未來尋找這個,看看HtmlUnit。 這個answer就是一個很好的例子。

相關問題