通过命中servlet向HTTPS服务器发出请求

时间:2012-09-14 14:38:17

标签: android servlets

这是我在http服务器上向servlet发出post请求的代码

private static void post(String endpoint, Map<String, String> params)
        throws IOException {
    URL url;
    try {
        url = new URL(endpoint);
    } catch (MalformedURLException e) {
        throw new IllegalArgumentException("invalid url: " + endpoint);
    }
    StringBuilder bodyBuilder = new StringBuilder();
    Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
    // constructs the POST body using the parameters
    while (iterator.hasNext()) {
        Entry<String, String> param = iterator.next();
        bodyBuilder.append(param.getKey()).append('=')
                .append(param.getValue());
        if (iterator.hasNext()) {
            bodyBuilder.append('&');
        }
    }
    String body = bodyBuilder.toString();
    Log.v(TAG, "Posting '" + body + "' to " + url);
    byte[] bytes = body.getBytes();
    HttpURLConnection conn = null;


    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setFixedLengthStreamingMode(bytes.length);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded;charset=UTF-8");
        // post the request
        OutputStream out = conn.getOutputStream();
        out.write(bytes);
        out.close();
        // handle the response
        int status = conn.getResponseCode();
        if (status != 200) {
          throw new IOException("Post failed with error code " + status);
        }
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }
  }

当我的结束点像 http:// myipaddress:myport / 时,它运行良好,但当我将其更改为 https <时/ strong>连接无法正常工作我也读到了 HttpsURLConnection ,但我没有得到如何实现它,他们已经写了这段代码:

KeyStore keyStore = ...;
   TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
   tmf.init(keyStore);

   SSLContext context = SSLContext.getInstance("TLS");
   context.init(null, tmf.getTrustManagers(), null);

   URL url = new URL("https://www.example.com/");
   HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
   urlConnection.setSSLSocketFactory(context.getSocketFactory());
   InputStream in = urlConnection.getInputStream();

但是我无法获得Keystore中应该只有文件文件的内容,如果我使用的是Keystore.getInstance(字符串类型),那么如何获取证书类型。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

请检查这个以发送安全服务器的发布请求

//请求

    String Verify_Mobile_URL ="https://www.sample.php";
                        try 
                        {

                            StringBuilder postDataBuilder = new StringBuilder();
                            postDataBuilder.append("param1").append("=").append("paramvalue");
                            postDataBuilder.append("&").append("param2").append("=").append("paramvalue");


                            byte[] postData = postDataBuilder.toString().getBytes();

                            // Hit the dm URL.

                            URL url = new URL(Verify_Mobile_URL);
                            HttpsURLConnection.setDefaultHostnameVerifier(new AllVerifier());
                            SSLContext sslContext = SSLContext.getInstance("TLS");
                            sslContext.init(null, new TrustManager[] { new AllTrustManager() }, null);
                            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
                            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();        
                            conn.setReadTimeout(60000);
                            conn.setConnectTimeout(35000);
                            conn.setDoOutput(true);
                            conn.setUseCaches(false);
                            conn.setRequestMethod("POST");
                            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                            conn.setRequestProperty("Content-Length",Integer.toString(postData.length));

                            OutputStream out = conn.getOutputStream();
                            out.write(postData);
                            out.close();

                            int responseCode = conn.getResponseCode();
                            if(responseCode==200)
                            {
                                InputStream inputstream=conn.getInputStream();  
                                String result=streamToString(inputstream);   // here you will will get result from

                            }
                            catch(Exception e)
                            {
                            }







/**
     * This method convert inputstream to string
     * @param is - inputtream to be converted
     * @return String - converted string 
     */
    public static String streamToString(InputStream is)
    {
        DataInputStream din = new DataInputStream(is);
        StringBuffer sb = new StringBuffer();
        try {
            String line = null;
            while ((line = din.readLine()) != null) 
            {
                sb.append(line + "\n");
            }

        } 
        catch (Exception ex) 
        {}      

        finally 
        {
            try 
            {  if(is!=null)
                {
                    din.close();
                    is.close();
                }
            } 
            catch (Exception ex) 
            {}

        }
        return sb.toString();

    }
















public class AllTrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        // TODO Auto-generated method stub

    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
        // TODO Auto-generated method stub

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return new X509Certificate[0];
    }

}





public class AllVerifier implements HostnameVerifier {

    @Override
    public boolean verify(String hostname, SSLSession session) {
        // TODO Auto-generated method stub
        return true;
    }

}