【问题标题】:HttpsURLConnection and POSTHttpsURLConnection 和 POST
【发布时间】:2011-05-21 13:21:13
【问题描述】:

前段时间我用python编写了这个程序,它使用https登录网站,获取一些信息并注销。 程序很简单:

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;
    }
}

问题是,登录不起作用,当我尝试获取需要我登录的页面时,我收到“再次登录”消息。 这两个类看起来完全一样,我不明白为什么我不能让第二个工作......有什么想法吗?

【问题讨论】:

    标签: java python


    【解决方案1】:

    任何人在未来寻找这个,看看HtmlUnit。 这个answer 有一个很好的例子。

    【讨论】:

      【解决方案2】:

      你从哪里得到你的sid?从症状来看,我猜您的会话 cookie 未正确传递到服务器

      请参阅此问题以获得可能的解决方案:Cookies turned off with Java URLConnection

      一般来说,我建议您使用HttpClient 在 Java 中实现 HTTP 对话(任何比简单的一次性 GET 或 POST 更复杂的方法)。请参阅code examples(我猜“基于表单的登录”示例适合您的情况)。

      【讨论】:

      • 我自己解决了这个问题。问题是 request.setFollowRedirects();强制 httpurlconnection 跟随重定向,但忘记发送 cookie。我将 followredirects 设置为 false,获取 Location 标头,并发出第二个请求。这就像一个魅力:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2021-11-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多