標籤:網上 put ppi generated create ror client auth failure
先插一句。Google出的volley架構本身是支援https請求的,可是僅僅是針對有第三方機構認證過的。
假設自己隨便在網上搞的一個認證,那volley是不支援要求的。
本文講下怎樣讓volley支援自己搞的https認證。
改動volley原始碼:com.android.myvolley.toolbox.HurlStack
/** * Create an {@link HttpURLConnection} for the specified {@code url}. */ protected HttpURLConnection createConnection(URL url) throws IOException { if (url.toString().contains("https")) { MyHttpsManager.allowAllSSL(); } return (HttpURLConnection) url.openConnection(); }在HurlStack類中的createConnection方法中,做個過濾處理:
if (url.toString().contains("https")) { MyHttpsManager.allowAllSSL(); }直接貼代碼啦。
import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;public class MyHttpsManager implements X509TrustManager { private static TrustManager[] trustManagers; @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public static void allowAllSSL() { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { // TODO Auto-generated method stub return true; } }); SSLContext context = null; if (trustManagers == null) { trustManagers = new TrustManager[] { new MyHttpsManager() }; } try { context = SSLContext.getInstance("TLS"); context.init(null, trustManagers, new SecureRandom()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } HttpsURLConnection.setDefaultSSLSocketFactory(context .getSocketFactory()); }}
然後請求的時候在頭裡面加個什麼鬼id。sign之類的,就能夠和服務端通訊了。
比如volley重寫getHeaders方法:
public void sendRequest(int method, String url, JSONObject jsonRequest, final String sessionToken, final OnResponseListener listener,final OnErrorListener errorListener) { initUserAgent(); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(method, url, jsonRequest, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { listener.onResponse(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { errorListener.onErrorResponse(error); } }){ @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String,String>(); headers.put("Content-Type", "application/json"); headers.put("x-app-id", APPID); headers.put("x-app-sign",SIGN); headers.put("x-session-token",sessionToken); headers.put("User-Agent",userAgent); return headers; } }; Volley.newRequestQueue(context).add(jsonObjectRequest); }
Google Volley架構之https請求