我的WebUtil工具类--获取IP与发送http请求
来源:互联网 发布:ajax接收不到json数据 编辑:程序博客网 时间:2024/06/03 17:37
发送http请求分别使用了HttpURLConnection和org.apache.http.impl.client.HttpClients实现
import org.apache.http.Consts;import org.apache.http.HttpEntity;import org.apache.http.HttpEntityEnclosingRequest;import org.apache.http.HttpRequest;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpRequestRetryHandler;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.conn.ConnectTimeoutException;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.entity.ContentType;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.*;import java.security.KeyManagementException;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.cert.X509Certificate;import java.util.HashMap;import java.util.Map;public class WebUtil {private static Logger logger = LoggerFactory.getLogger(WebUtil.class);/** * 获取IP * @param request * @return * 修改获取ip方法,对于10.内网段重新获取远程ip地址 */public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)||ip.startsWith("10.")) { ip = request.getRemoteAddr(); } return ip;}/** * 向客户端发送信息 * @param response * @param data */public static void sendData(HttpServletResponse response, String data) {PrintWriter printWriter = null;try {response.setCharacterEncoding("UTF-8");printWriter = response.getWriter();printWriter.write(data);} catch (IOException e) {e.printStackTrace();} finally {if (printWriter != null) {printWriter.flush();printWriter.close();}}}/** * HttpURLConnection 发送请求 * @author qiulongjie * @param uri * @param method * @param params * @param encode * @return */public static String sendData(String uri,String method,String params,String encode){try {URL url = new URL(uri);HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setConnectTimeout(CONNECT_TIMEOUT);urlConnection.setReadTimeout(SOCKET_TIMEOUT);// 设置允许输入输出urlConnection.setDoInput(true);urlConnection.setDoOutput(true);byte[] mydata = params.getBytes();// 设置请求报文头,设定请求数据类型urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 设置请求数据长度urlConnection.setRequestProperty("Content-Length", String.valueOf(mydata.length));// 设置POST方式请求数据urlConnection.setRequestMethod(method);OutputStream outputStream = urlConnection.getOutputStream();outputStream.write(mydata);outputStream.flush();outputStream.close();int responseCode = urlConnection.getResponseCode();if (responseCode == 200) {return changeInputStream(urlConnection.getInputStream(), encode);}} catch (IOException e) {e.printStackTrace();}return "";}/** * HttpURLConnection 发送请求 * @author qiulongjie * @param uri * @param method * @param params * @param encode * @return */public static String sendData(String uri,String method,Map<String,Object> params,String encode,boolean isUrlencode){StringBuffer buffer = new StringBuffer();if (params != null && !params.isEmpty()) {if(isUrlencode){try {for (Map.Entry<String, Object> entry : params.entrySet()) {buffer.append(entry.getKey()).append("=").append(URLEncoder.encode(String.valueOf(entry.getValue()),encode)).append("&");// 请求的参数之间使用&分割。}} catch (UnsupportedEncodingException e) {e.printStackTrace();}}else{for (Map.Entry<String, Object> entry : params.entrySet()) {buffer.append(entry.getKey()).append("=").append(String.valueOf(entry.getValue())).append("&");// 请求的参数之间使用&分割。}}buffer.deleteCharAt(buffer.length() - 1);}logger.info(buffer.toString());logger.info(uri);return sendData(uri, method, buffer.toString(), encode);}/** * 把输入流转为字符串 * @author qiulongjie * @param inputStream * @param encode * @return */public static String changeInputStream(InputStream inputStream, String encode) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] data = new byte[1024];int len = 0;String result = "";if (inputStream != null) {try {while ((len = inputStream.read(data)) != -1) {outputStream.write(data, 0, len);}result = new String(outputStream.toByteArray(), encode);} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}return result;}// *********************org.apache.http.impl.client.HttpClients ******* start -----/** * 利用org.apache.http.impl.client.HttpClients发送post请求 * @author qiulongjie * @param uri * @param params * @return */public static String postData(String uri,Map<String,Object> params){StringBuffer buffer = new StringBuffer();if (params != null && !params.isEmpty()) {for (Map.Entry<String, Object> entry : params.entrySet()) {buffer.append(entry.getKey()).append("=").append(String.valueOf(entry.getValue())).append("&");// 请求的参数之间使用&分割。}buffer.deleteCharAt(buffer.length() - 1);}return postData(uri,buffer.toString());}/** * 利用org.apache.http.impl.client.HttpClients发送post请求 * @author qiulongjie * @param uri * @param params * @return */public static String postData(String uri,String params){StringEntity myEntity = new StringEntity(params,ContentType.create("application/x-www-form-urlencoded", Consts.UTF_8));// 构造请求数据 return postInfo(uri,myEntity);}/** * 利用org.apache.http.impl.client.HttpClients发送post请求 发送json数据 * @author qiulongjie * @param uri * @param json * @return */public static String postJOSN(String uri,String json){ StringEntity myEntity = new StringEntity(json,ContentType.APPLICATION_JSON);// 构造请求数据 return postInfo(uri,myEntity);}/** * 利用org.apache.http.impl.client.HttpClients发送post请求 * @author qiulongjie * @param uri * @param myEntity * @return */public static String postInfo(String uri,StringEntity myEntity){CloseableHttpClient client = HttpClients.custom().setRetryHandler(retryHandler).build(); //链接配置 RequestConfig config = createRequestConfig(); HttpPost post = new HttpPost(uri); post.setConfig(config); post.setEntity(myEntity); CloseableHttpResponse response = null; try { response = client.execute(post); if (null != response && response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); return EntityUtils.toString(entity, "UTF-8"); } return null; } catch (ClientProtocolException e) { logger.error(e.toString()); e.printStackTrace(); } catch (IOException e) { logger.error(e.toString()); e.printStackTrace(); }finally{closeHttp(client, response); }return null;}/** * 以GET方式发送数据 * @author qiulongjie * @param uri * @return */public static String sendInfoForGET(String uri){CloseableHttpClient client = HttpClients.custom().setRetryHandler(retryHandler).build(); //链接配置 RequestConfig config = createRequestConfig(); HttpGet get = new HttpGet(uri); get.setConfig(config); CloseableHttpResponse response = null; try {response = client.execute(get); if (null != response && response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); return EntityUtils.toString(entity, "UTF-8"); } return null; } catch (ClientProtocolException e) { logger.error(e.toString()); e.printStackTrace(); } catch (IOException e) { logger.error(e.toString()); e.printStackTrace(); }finally{closeHttp(client, response); }return null;}/** * 发送https请求 get方式 * @param uri * @return */public static String sendHttpsForGET(String uri){CloseableHttpClient client = createSSLClientDefault();//链接配置RequestConfig config = createRequestConfig();HttpGet get = new HttpGet(uri);get.setConfig(config);CloseableHttpResponse response = null;try {response = client.execute(get);if (null != response && response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();return EntityUtils.toString(entity, "UTF-8");}return null;} catch (ClientProtocolException e) {logger.error(e.toString());e.printStackTrace();} catch (IOException e) {logger.error(e.toString());e.printStackTrace();}finally{closeHttp(client, response);}return null;}/** * 创建ssl请求 * @return */public static CloseableHttpClient createSSLClientDefault(){try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {//信任所有public boolean isTrusted(X509Certificate[] chain,String authType) {return true;}}).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);return HttpClients.custom().setRetryHandler(retryHandler).setSSLSocketFactory(sslsf).build();} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyStoreException e) {e.printStackTrace();}return HttpClients.custom().setRetryHandler(retryHandler).build();}/** 关闭 */private static void closeHttp(CloseableHttpClient client, CloseableHttpResponse response) {try {if (response != null){response.close();}} catch (IOException e) {logger.error(e.toString());} finally {try {if (client != null){client.close();}} catch (IOException e) {logger.error(e.toString());}}}/** * 获取连接配置 * @return */private static RequestConfig createRequestConfig(){if( REQUEST_CONFIG == null ){synchronized (WebUtil.class){if( REQUEST_CONFIG == null ){REQUEST_CONFIG = RequestConfig.custom().setSocketTimeout(SOCKET_TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT).setConnectionRequestTimeout(CONNECT_REQUEST_TIMEOUT).setStaleConnectionCheckEnabled(true).build();}}}return REQUEST_CONFIG;}/** * 重连次数 */private static final int RETRY_CONNECTION_COUNT = 3;/** * 响应超时时间 */private static final int SOCKET_TIMEOUT = 10000;/** * 链接超时时间 */private static final int CONNECT_TIMEOUT = 10000;/** * */private static final int CONNECT_REQUEST_TIMEOUT = 10000;/** * 连接配置 */private static RequestConfig REQUEST_CONFIG = null;/** * 重连处理器 */private static HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() { /** * exception异常信息; * executionCount:重连次数; * context:上下文 */ @Override public boolean retryRequest(IOException exception, int executionCount,HttpContext context) { if (executionCount >= RETRY_CONNECTION_COUNT) {//如果连接次数超过RETRY_CONNECTION_COUNT次,就不进行重复连接 return false; } System.out.println(exception.getClass()); if (exception instanceof SocketTimeoutException) {//响应超时 logger.warn("响应超时--重连接次数:"+executionCount+"--导致重连接的异常:"+exception+"--导致重连接的http.request:"+((HttpClientContext) context).getAttribute("http.request").toString()); return true; } if (exception instanceof UnknownHostException) {//未找到主机 logger.warn("未找到主机--重连接次数:"+executionCount+"--导致重连接的异常:"+exception+"--导致重连接的http.request:"+((HttpClientContext) context).getAttribute("http.request").toString()); return true; } if (exception instanceof ConnectTimeoutException) {//连接超时 logger.warn("连接超时--重连接次数:"+executionCount+"--导致重连接的异常:"+exception+"--导致重连接的http.request:"+((HttpClientContext) context).getAttribute("http.request").toString()); return true; }if (exception instanceof InterruptedIOException) {//io操作中断logger.warn("io操作中断(响应超时)--重连接次数:"+executionCount+"--导致重连接的异常:"+exception+"--导致重连接的http.request:"+((HttpClientContext) context).getAttribute("http.request").toString());return true;} if (exception instanceof SSLException) { //SSL handshake exception return false; } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { // Retry if the request is considered idempotent return true; } return false; } };}
0 0
- 我的WebUtil工具类--获取IP与发送http请求
- 发送http请求工具类
- 获取客户端http请求IP地址工具类
- 获取请求ip的工具类
- httpClient 用于发送HTTP请求的工具类
- httpClient 用于发送HTTP请求的工具类
- java发送http的get、post请求工具类
- Http与HttpClient(已被废弃)通信的介绍,附带一个Http发送GET请求工具类的例子
- Http与HttpClient(已被废弃)通信的介绍,附带一个Http发送GET请求工具类的例子
- Java发送http请求工具类()
- 获取http请求的真实IP地址
- java 发送HTTP请求工具
- httputil用http获取请求的工具类
- 发送http请求获取数据
- 发送http请求获取响应
- java常用的发送http请求的工具方法
- Http请求的工具类
- Http请求的工具类
- poj1797最大生成树
- lang-8で見たいい文章
- 如何查看一款iOS 的App里面包含的图片
- mysql 分区 与分表
- android通讯录根据首字母分组(一)
- 我的WebUtil工具类--获取IP与发送http请求
- 数据库系统概论学习笔记---关系的俩个完整性
- Android四大组件
- border-radius 画圆
- Best Time to Buy and Sell Stock III
- 自定义View(环形下载,球形下载)
- [BZOJ 1597] Usaco2008 Mar 土地购买 · 斜率优化DP
- Binary Tree Level Order Traversal
- WAMP的MySQL 笔记