本帖最后由 liangtu33 于 2015-02-27 15:38:47 编辑

解决方案 »

  1.   

    还没到登录,在下载验证码的时候已经报异常了,代码如下:import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLContextBuilder;
    import org.apache.http.conn.ssl.TrustStrategy;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;public class XiaMen_IS
    { public static void main(String[] args)
    {
    crawler();
    } // 信息抓取
    public static void crawler()
    {
    try
    { CloseableHttpClient cbHttpClient = createSSLInsecureClient();
    getVerficationCode(cbHttpClient);
    } catch (Exception e)
    {
    System.out.println("---厦门社保抓取失败---");
    }
    } // 获取验证码
    private static String getVerficationCode(CloseableHttpClient cbHttpClient) throws Exception
    {
    try
    {
    String url = "https://app.xmhrss.gov.cn/wcm/servlet/VCodeServlet";// 验证码地址
    HttpGet get = new HttpGet(url);
    HttpResponse response = cbHttpClient.execute(get);// 报异常
    // 获取验证码字节数组
    byte data[] = EntityUtils.toByteArray(response.getEntity()); } catch (Exception e)
    {
    System.out.println("厦门社保下载验证码异常:");
    e.printStackTrace();
    throw e;
    } return null;
    } // client工具函数,信任对方(https)所有证书
    public static CloseableHttpClient createSSLInsecureClient()
    {
    try
    {
    // 创建安全套接字对象
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy()
    {
    // 信任所有
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException
    {
    return true;
    }
    }).build();
    // 获取分层tls/ssl连接
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
    return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    } catch (KeyManagementException e)
    {
    e.printStackTrace();
    } catch (NoSuchAlgorithmException e)
    {
    e.printStackTrace();
    } catch (KeyStoreException e)
    {
    e.printStackTrace();
    }
    return HttpClients.createDefault();
    }}
      

  2.   


    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
    改为
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());亲测已经可以把验证码下载下来了。
      

  3.   

    报语法错误httpclient用的什么版本?
    我用4.4运行的,org.apache.http.conn.ssl.SSLConnectionSocketFactory。
      

  4.   

    我又下了个httpclient-4.3.4.jar改成
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[] {"SSLv3"}, null, null);
    就可以了啊