2014-12-07 55 views
0

我想用用户名和密码登录https网站,转到该网站的一个网址,然后下载该网页的网址(也许解析该网页的内容页)。我只想使用核心Java apis而不是htmlunit,jsoup等。我得到了下面的代码来学习如何做到这一点,但它并没有告诉我如何登录到网站。请告诉我如何登录,维护会话,然后关闭连接。登录https网站并使用唯一的核心Java API下载页面

来源 - http://www.mkyong.com/java/java-https-client-httpsurlconnection-example/

import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.cert.Certificate; 
import java.io.*; 

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLPeerUnverifiedException; 

public class HttpsClient{ 

    public static void main(String[] args) 
    { 
     new HttpsClient().testIt(); 
    } 

    private void testIt(){ 

     String https_url = "https://www.google.com/"; 
     URL url; 
     try { 

     url = new URL(https_url); 
     HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); 

     //dumpl all cert info 
     print_https_cert(con); 

     //dump all the content 
     print_content(con); 

     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

    } 

    private void print_https_cert(HttpsURLConnection con){ 

    if(con!=null){ 

     try { 

    System.out.println("Response Code : " + con.getResponseCode()); 
    System.out.println("Cipher Suite : " + con.getCipherSuite()); 
    System.out.println("\n"); 

    Certificate[] certs = con.getServerCertificates(); 
    for(Certificate cert : certs){ 
     System.out.println("Cert Type : " + cert.getType()); 
     System.out.println("Cert Hash Code : " + cert.hashCode()); 
     System.out.println("Cert Public Key Algorithm : " 
            + cert.getPublicKey().getAlgorithm()); 
     System.out.println("Cert Public Key Format : " 
            + cert.getPublicKey().getFormat()); 
     System.out.println("\n"); 
    } 

    } catch (SSLPeerUnverifiedException e) { 
     e.printStackTrace(); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

    } 

    } 

    private void print_content(HttpsURLConnection con){ 
    if(con!=null){ 

    try { 

     System.out.println("****** Content of the URL ********");    
     BufferedReader br = 
     new BufferedReader(
      new InputStreamReader(con.getInputStream())); 

     String input; 

     while ((input = br.readLine()) != null){ 
      System.out.println(input); 
     } 
     br.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

     } 

    } 

} 

回答

1

每个网站管理登录不同。您需要搜寻网站,了解会话的维护方式,并以服务器无法辨别它不是浏览器的方式来模拟功能。

通常,网络服务器会在cookie中存储秘密散列。这里是过程

  1. 使用HttpsURLConnection发送表单的登录名和密码。
  2. 服务器响应一个头部中的哈希,它希望存储在Cookie中。通常在名称中有会话。
  3. 发送请求返回与哈希在头中的正确值

以上可以做到只使用URL和HttpsURLConnection的所有,但你需要模仿浏览器究竟欺骗服务器。

对于侦察,我会建议使用像fiddler这样的工具。它捕获所有来自Web服务器的通信并返回,以便您可以在http级别准确查看发生了什么以模仿您的Java代码。

Here is an overview of fiddler。我从来没有看过日志。 Fiddler有一个甜美的界面。视频真的很无聊,但它给出了界面的概述。你想看看原始文本视图,并模仿它。

对于您的其他问题,owasp是最佳实践的重要资源。事实上,存在许多不安全和糟糕的代码,那些代码是你永远不会期望的。我看到一个服务器把布尔值放在脚本标签内部,作为一个javascript变量存储。您只需仔细观察服务器在登录后如何更改响应。对于遵循最佳实践的热门网站,他们将使用上述方法。

+0

谢谢。我不知道如何使用小提琴手,但我会学习。顺便说一句,有没有包含所有可能的登录方法的教程? – stack1 2014-12-07 06:36:31

+0

任何提示什么在小提琴手“日志”寻找? – stack1 2014-12-07 06:37:14

+0

我还没有尝试过这个答案,但我仍然选择了它,因为它给了我一些有用的信息。 – stack1 2014-12-25 21:57:23