如何使用https / http协议(在Java中)登录后浏览网站

时间:2015-01-08 22:44:09

标签: java http https

我尝试使用Java登录网站,但我成功了。以下是我使用的代码。

    String query = "myquery";
    URL url = new URL(loginUrl);
    HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("Content-length", String.valueOf(query.length()));
    con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)");
    con.setDoOutput(true);
    con.setDoInput(true);

    DataOutputStream output = new DataOutputStream(con.getOutputStream());

    output.writeBytes(query);
    output.close();

    DataInputStream input = new DataInputStream( con.getInputStream() );

    for( int c = input.read(); c != -1; c = input.read() ) {
       System.out.print( (char)c );
       // this page returns JavaScript code
    }

在此之后,我想访问同一个域中的另一个网页,所以我尝试了下面的代码。

    URL url = new URL(anotherUrl);
    HttpURLConnection con = (HttpURLConnection) url.openConnection();

    ... similar to above code ... 

但此页面要求我再次登录。我认为在更改URL的过程中连接已断开连接。 (Onlt登录页面使用HTTPS协议,其他页面使用HTTP协议)

我该如何解决这个问题? 有人请帮忙

1 个答案:

答案 0 :(得分:0)

请记住,HTTP完全是无状态的。 "登录"的想法到站点转换为(通常)从HTTP角度设置cookie。这些cookie只是HTTP标头,它们随浏览器的每个后续请求一起发送。因此,为了保持登录状态,您可以从响应标头中获取Cookie并将其与未来请求一起发送。

以下是:

从回复中检索Cookie:

打开java.net.URLConnection到服务器:

URL myUrl = new URL("http://www.hccp.org/cookieTest.jsp");
URLConnection urlConn = myUrl.openConnection();
urlConn.connect();

遍历响应标头寻找Cookie: 由于服务器可以在单个请求中设置多个cookie,因此我们需要遍历响应头,查找名为" Set-Cookie"的所有头文件。

String headerName=null;
for (int i=1; (headerName = uc.getHeaderFieldKey(i))!=null; i++) {
   if (headerName.equals("Set-Cookie")) {                  
    String cookie = urlConn.getHeaderField(i);               
    ...                                                      

从Cookie字符串中提取Cookie名称和值 getHeaderField(int index)方法返回的字符串是一系列由分号(;)分隔的name = value。第一个名称/值配对是我们感兴趣的实际数据字符串(即" sessionId = 0949eeee22222rtg"或" userId = igbrown"),后续的名称/值配对是元信息我们将用它来管理cookie的存储(当它到期时等)。

    cookie = cookie.substring(0, cookie.indexOf(";"));
    String cookieName = cookie.substring(0, cookie.indexOf("="));
    String cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.length());

基本上就是这样。我们现在有cookie名称(cookieName)和cookie值(cookieValue)。

在请求中设置cookie值:

必须在调用connect方法之前设置值:

 URL myUrl = new URL("http://www.hccp.org/cookieTest.jsp");
    URLConnection urlConn = myUrl.openConnection();

创建一个cookie字符串:

String myCookie = "userId=igbrown";

将Cookie添加到请求中: 使用

setRequestProperty(String name,String value);

方法,我们将添加名为" Cookie"的属性,将上一步中创建的cookie字符串作为属性值传递。

urlConn.setRequestProperty("Cookie", myCookie);

将cookie发送到服务器: 要发送cookie,只需在我们添加了cookie属性的URLConnection上调用connect():

 urlConn.connect()