`
弄月吟风
  • 浏览: 198441 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android Https通信

 
阅读更多

https与http的通信,在我看来主要的区别在于https多了一个安全验证机制,而Android采用的是X509验证,首先我们需要这重写X509类,建立我们的验证规则、、不过对于特定的项目,我们一般都是无条件信任服务端的,因此我们可以对任何证书都无条件信任(其实本质上我们只是信任了特定url的证书,为了偷懒,才那么选择的)/**

 * 信任所有主机-对于任何证书都不做检查
 */
class MytmArray implements X509TrustManager {
	public X509Certificate[] getAcceptedIssuers() {
		// return null;
		return new X509Certificate[] {};
	}

	@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
		// System.out.println("cert: " + chain[0].toString() + ", authType: "
		// + authType);
	}
};

 好了,我们写好了信任规则,接下载就要创建一个主机的信任列表

static TrustManager[] xtmArray = new MytmArray[] { new MytmArray() };

	/**
	 * 信任所有主机-对于任何证书都不做检查
	 */
	private static void trustAllHosts() {
		// Create a trust manager that does not validate certificate chains
		// Android 采用X509的证书信息机制
		// Install the all-trusting trust manager
		try {
			SSLContext sc = SSLContext.getInstance("TLS");
			sc.init(null, xtmArray, new java.security.SecureRandom());
			HttpsURLConnection
					.setDefaultSSLSocketFactory(sc.getSocketFactory());
			// HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);//
			// 不进行主机名确认
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
		@Override
		public boolean verify(String hostname, SSLSession session) {
			// TODO Auto-generated method stub
			// System.out.println("Warning: URL Host: " + hostname + " vs. "
			// + session.getPeerHost());
			return true;
		}
	};

 上面的都是https通信需要做的几个基本要求,接下载我们要做的就是https的使用啦下面就以get和post为例进行说明,中间还涉及到cookie的使用

String httpUrl="XXXXX"
String result = "";
		HttpURLConnection http = null;
		URL url;
		try {
			url = new URL(httpUrl);
			// 判断是http请求还是https请求
			if (url.getProtocol().toLowerCase().equals("https")) {
				trustAllHosts();
				http = (HttpsURLConnection) url.openConnection();
				((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认

			} else {
				http = (HttpURLConnection) url.openConnection();
			}
			http.setConnectTimeout(10000);// 设置超时时间
			http.setReadTimeout(50000);
			http.setRequestMethod("GET");// 设置请求类型为
			http.setDoInput(true);
			http.setRequestProperty("Content-Type", "text/xml");
//http.getResponseCode());http或https返回状态200还是403
BufferedReader in = null;
			if (obj.getHttpStatus() == 200) {
				getCookie(http);
				in = new BufferedReader(new InputStreamReader(
						http.getInputStream()));
			} else
				in = new BufferedReader(new InputStreamReader(
						http.getErrorStream()));
			result = in.readLine();
			Log.i("result", result);
			in.close();
			http.disconnect();

 https或http的get请求写好了,哦中间涉及到了一个getCookie的方法,如下:

/** 得到cookie */
	private static void getCookie(HttpURLConnection http) {
		String cookieVal = null;
		String key = null;
		DataDefine.mCookieStore = "";
		for (int i = 1; (key = http.getHeaderFieldKey(i)) != null; i++) {
			if (key.equalsIgnoreCase("set-cookie")) {
				cookieVal = http.getHeaderField(i);
				cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
				DataDefine.mCookieStore = DataDefine.mCookieStore + cookieVal
						+ ";";
			}
		}
	}
 public static Query HttpQueryReturnClass(String httpUrl, String base64) {
		String result = "";
		Log.i("控制", httpUrl);
		Query obj = new Query();
		HttpURLConnection http = null;
		URL url;
		try {
			url = new URL(httpUrl);
			// 判断是http请求还是https请求
			if (url.getProtocol().toLowerCase().equals("https")) {
				trustAllHosts();
				http = (HttpsURLConnection) url.openConnection();
				((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
			} else {
				http = (HttpURLConnection) url.openConnection();
			}
			http.setConnectTimeout(10000);// 设置超时时间
			http.setReadTimeout(50000);
			http.setRequestMethod("POST");// 设置请求类型为post
			http.setDoInput(true);
			http.setDoOutput(true);
			http.setRequestProperty("Content-Type", "text/xml");
			http.setRequestProperty("Cookie", DataDefine.mCookieStore);
			DataOutputStream out = new DataOutputStream(http.getOutputStream());
			out.writeBytes(base64);
			out.flush();
			out.close();
			obj.setHttpStatus(http.getResponseCode());// 设置http返回状态200还是403
			BufferedReader in = null;
			if (obj.getHttpStatus() == 200) {
				getCookie(http);
				in = new BufferedReader(new InputStreamReader(
						http.getInputStream()));
			} else
				in = new BufferedReader(new InputStreamReader(
						http.getErrorStream()));
			result = in.readLine();// 得到返回结果
			in.close();
			http.disconnect();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
 这里面的base64是我经过base64加密过以后的数据
分享到:
评论
4 楼 guoshijie1990 2016-08-16  
写的不错
3 楼 Visual_chenpeng 2014-10-27  
 
2 楼 na_tsu 2013-07-11  
有完整的代码吗?发到我的邮箱liangzhanhong90@163.com,谢谢
1 楼 zy_zhangyuan88 2013-06-05  
有demo吗?发到我邮箱472918259@qq.com,急用!谢谢大侠

相关推荐

    Android Https通信改进版

    在Android开发中,HTTPS通信是保护用户数据安全的重要手段,特别是在传输敏感信息如登录凭证、个人信息等时。本文将深入探讨Android中HTTPS通信的改进版,以提高应用的安全性和性能。 首先,理解HTTPS的核心概念至...

    Android:HTTPS通信

    在Android应用开发中,HTTPS通信是确保数据安全传输的重要手段,尤其是在使用WebView组件时。WebView是一种可以在应用程序内部显示网页内容的控件,因此理解如何在WebView中正确实施HTTPS通信至关重要。 首先,...

    android https双向通信验证调研报告

    Android系统支持标准的Java SSL/TLS实现,可以通过HttpURLConnection或OkHttp等第三方库实现HTTPS通信。为了实现双向认证,Android客户端需要提供自己的证书,这通常涉及修改系统的信任存储或自定义TrustManager。 ...

    Android串口通信Demo

    博客链接<https://blog.csdn.net/qq_37069563>可能提供了具体的代码示例和详细步骤,可以帮助开发者深入理解并实现Android串口通信。Code文件可能包含这个示例项目的源代码,通过分析和学习这些代码,可以更直观地...

    Android USB通信app

    5. **编程实现**:在Android应用开发中,使用第三方库如UsbSerial(https://github.com/felHR85/UsbSerial)可以简化USB通信的实现。这个库为多种常见的USB串口芯片提供了封装好的API,包括Arduino常用的FTDI、CH340...

    android的Http通信

    在Android开发中,进行HTTP通信是常见的操作,用于与服务器交换数据。HTTP(超文本传输协议)是一种基于TCP/IP通信协议来交换数据的应用层协议,广泛应用于网页浏览、API交互等场景。本教程将深入讲解如何在Android...

    Android网络通信实例

    在Android开发中,网络通信是应用与服务器交互的重要方式,使得手机应用能够获取或发送数据。本实例将向你展示如何在Android环境中实现简单的HTTP GET和POST请求,这对于初学者来说是一个很好的学习起点。 首先,...

    Android网络通信的6种实例代码

    在Android平台上进行网络通信是应用程序开发中的重要组成部分,因为大多数现代应用都需要与远程服务器进行交互,获取或发送数据。Android提供了多种方式来实现这一目标,包括基础的Java网络API、特定于Android的网络...

    Android通过https协议与服务器端进行通信

    "Android 通过 HTTPS 协议与服务器端进行通信" Android 通过 HTTPS 协议与服务器端进行通信是指 Android 客户端使用 HTTPS 协议与服务器端建立连接,并进行数据交换的过程。HTTPS 协议是基于 HTTP 协议的加密版本,...

    android 局域网通信

    3. **HTTP/HTTPS**:虽然不是直接的局域网通信协议,但在某些场景下,可以作为传输层,如通过服务器转发数据到其他设备。 4. **Bonjour/Zeroconf**:适合于发现局域网内的服务,如打印机、文件服务器等。 三、实现...

    Android网络通信相关的论文和文献

    首先,Android平台提供了多种网络通信方式,包括HTTP/HTTPS、Socket编程、FTP、Bluetooth等。其中,HTTP/HTTPS是最常见的网络请求方式,通过Android的HttpURLConnection或第三方库如OkHttp、Volley等实现。这些论文...

    Android USB通信源码/DEMO

    Android USB通信源码/DEMO 说明:https://blog.csdn.net/lxt1292352578/article/details/131976810 github:https://github.com/LXTTTTTT/USBtoSerialPortDemo 连接流程: 获取当前系统可用的 USB 设备列表 → 选中...

    Android串口通信超简单的Demo

    1,本Demo是使用 android studio 2.1 编写,可以...2,本Demo是对google推荐的串口通信开源项目android_serialport_api的简化,便于学习; 3,使用方法见博客:https://blog.csdn.net/haiger_xxx/article/details/51597237

    Android 语音通信

    在Android平台上实现语音通信涉及到多个技术领域,包括网络通信、音频处理、权限管理以及API的使用等。以下是对这些知识点的详细阐述: 1. **网络通信**:Android语音通信的基础是建立可靠的网络连接,通常使用TCP...

    Android 组件化开发module间通信

    总结来说,Android组件化开发中的模块间Activity通信是一个重要的话题。通过使用像ActivityRouter这样的库,开发者可以有效地管理和简化不同模块间的交互,提高代码的可读性和可维护性。同时,理解并熟练掌握这类...

    android+https的例子

    Android中的`HttpClient`是Apache HTTP客户端库的一部分,它支持HTTPS通信。在使用HttpClient时,需要创建一个`SSLSocketFactory`实例来处理SSL连接。通过`KeyStore`加载服务端的公钥证书,然后设置到`...

    android与服务器通信

    在Android应用开发中,与服务器进行通信是必不可少的环节,特别是在构建涉及用户登录、数据交换等应用场景时。本文将深入探讨Android与服务器通信的基本概念、技术选型以及具体实现方式,以标题“android与服务器...

    javaweb与Android通信代码

    首先,Java Web(通常指的是基于Java Servlet、JSP和相关技术构建的Web应用程序)与Android之间的通信主要涉及两种方式:HTTP/HTTPS请求和WebSocket。HTTP/HTTPS是最基础的通信协议,适用于简单的客户端-服务器交互...

    Android TCP Socket通信实例Demo源码Apk下载

    本Demo主要实现了安卓(Android)TCP 客户端(Client)和服务器(Server)Demo的Socket通讯。以及对接硬件的项目数据在十六进制&&byte&&int的转换处理。 要注意BufferedReader的readLine()方法的阻塞问题: 读取socket输入...

Global site tag (gtag.js) - Google Analytics