关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)
2018-09-04 14:22
471 查看
https协议对于开发者而言其实只是多了一步证书验证的过程。这个证书正常情况下被jdk/jre/security/cacerts所管理。里面证书包含两种情况:
1、机构所颁发的被认证的证书,这种证书的网站在浏览器访问时https头显示为绿色如百度
2、个人所设定的证书,这种证书的网站在浏览器里https头显示为红色×,且需要点击信任该网站才能继续访问。而点击信任这一步的操作就是我们在java代码访问https网站时区别于http请求需要做的事情。
所以JAVA发送Https请求有两种情况,三种解决办法:
第一种情况:Https网站的证书为机构所颁发的被认证的证书,这种情况下和http请求一模一样,无需做任何改变,用HttpsURLConnection或者HttpURLConnection都可以
[code]public static void main(String[] args) throws Exception{ URL serverUrl = new URL("https://xxxx"); HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); //必须设置false,否则会自动redirect到重定向后的地址 conn.setInstanceFollowRedirects(false); conn.connect(); String result = getReturn(conn); } /*请求url获取返回的内容*/ public static String getReturn(HttpURLConnection connection) throws IOException{ StringBuffer buffer = new StringBuffer(); //将返回的输入流转换成字符串 try(InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, ConstantInfo.CHARSET); BufferedReader bufferedReader = new BufferedReader(inputStreamReader);){ String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } String result = buffer.toString(); return result; } }
第二种情况:个人所设定的证书,这种证书默认不被信任,需要我们自己选择信任,信任的办法有两种:
A、将证书导入java的运行环境中
- 从该网站下载或者从网站开发者出获取证书cacert.crt
- 运行命令将证书导入java运行环境:keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file cacert.crt -alias xxx
- 完成。java代码中发送https的请求和http一样,同第一种情况。
B、忽略证书验证过程,忽略之后任何Https协议网站皆能正常访问,同第一种情况
[code]import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; public class MyX509TrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate certificates[],String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] ax509certificate,String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } }
[code]public static void main(String[] args) throws Exception{ SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); URL url = new URL("https://xxxx"); HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { public boolean verify(String s, SSLSession sslsession) { System.out.println("WARNING: Hostname is not matched for cert."); return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); //之后任何Https协议网站皆能正常访问,同第一种情况 }
C、java代码中加载证书,必须使用HttpsURLConnection方式
[code]public static void main(String[] args) throws Exception{ SSLContext sslcontext = SSLContext.getInstance("SSL","SunJSSE"); sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); URL serverUrl = new URL("https://xxxx"); HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); conn.setSSLSocketFactory(sslcontext.getSocketFactory()); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); //必须设置false,否则会自动redirect到重定向后的地址 conn.setInstanceFollowRedirects(false); conn.connect(); String result = getReturn(conn); } /*请求url获取返回的内容*/ public static String getReturn(HttpsURLConnection connection) throws IOException{ StringBuffer buffer = new StringBuffer(); //将返回的输入流转换成字符串 try(InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, ConstantInfo.CHARSET); BufferedReader bufferedReader = new BufferedReader(inputStreamReader);){ String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } String result = buffer.toString(); return result; } }
阅读更多
相关文章推荐
- 关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)
- 关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)
- 关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)
- JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)区别
- Java利用HttpURLConnection发送post请求
- Java利用HttpURLConnection发送post请求上传文件
- Java利用HttpURLConnection发送post请求上传文件
- 用HttpURLConnection 在Java后台发送请求并接收返回数据
- Java使用HttpURLConnection发送Get及Post请求简单过程
- Java学习--HttpURLConnection发送post请求
- HTTP协议请求实现类CloseableHttpClient和HttpsURLConnection及HttpURLConnection
- java基础——用HttpURLConnection向服务器发送POST请求
- android发送http请求—-URLConnection、HttpURLConnection的使用
- Java利用HttpURLConnection发送请求
- Java使用HttpURLConnection发送POST和GET请求
- java HttpURLConnection 模拟发送浏览器请求
- 在JAVA中使用HttpURLConnection发送POST请求
- Android/java 利用HttpUrlConnection 发送put请求,携带json参数
- java发送post和get请求(1)---HttpURLConnection方式
- 在Java中使用HttpURLConnection发送http客户端请求、服务器端返回信息、接受服务器端的信息