最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項目中使用OkHttp獲取IP地址的示例代碼

 更新時間:2024年08月19日 10:18:19   作者:無名指的等待712  
OkHttp?是一個由?Square?開發(fā)的高效、現(xiàn)代的?HTTP?客戶端庫,用于?Android?和?Java?應(yīng)用程序,它支持?HTTP/2?和?SPDY?等現(xiàn)代網(wǎng)絡(luò)協(xié)議,并提供了多種功能和優(yōu)化,本文給大家介紹了SpringBoot項目中如何獲取IP地址,需要的朋友可以參考下

前言

OkHttp 是一個由 Square 開發(fā)的高效、現(xiàn)代的 HTTP 客戶端庫,用于 Android 和 Java 應(yīng)用程序。它支持 HTTP/2 和 SPDY 等現(xiàn)代網(wǎng)絡(luò)協(xié)議,并提供了多種功能和優(yōu)化,使其成為處理網(wǎng)絡(luò)請求的流行選擇。這次項目中我將會使用OkHttp來發(fā)送網(wǎng)絡(luò)請求

一、OkHttp是什么?

OkHttp 是一個由 Square 開發(fā)的高效、現(xiàn)代的 HTTP 客戶端庫,用于 Android 和 Java 應(yīng)用程序。

二、使用步驟

1.OkHttp請求代碼

package com.easybbs.utils;
 
import com.easybbs.entity.enums.ResponseCodeEnum;
import com.easybbs.exception.BusinessException;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.concurrent.TimeUnit;
 
public class OKHttpUtils {
    /**
     * 請求超時時間5秒
     */
    private static final int TIME_OUT_SECONDS = 5;
 
    private static Logger logger = LoggerFactory.getLogger(OKHttpUtils.class);
 
    private static OkHttpClient.Builder getClientBuilder() {
        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().followRedirects(false).addInterceptor(new RedirectInterceptor()).retryOnConnectionFailure(false);
        clientBuilder.connectTimeout(TIME_OUT_SECONDS, TimeUnit.SECONDS).readTimeout(TIME_OUT_SECONDS, TimeUnit.SECONDS);
        clientBuilder.sslSocketFactory(createSSLSocketFactory()).hostnameVerifier((hostname, session) -> true);
        return clientBuilder;
    }
 
    private static Request.Builder getRequestBuilder(Map<String, String> header) {
        Request.Builder requestBuilder = new Request.Builder();
        if (null != header) {
            for (Map.Entry<String, String> map : header.entrySet()) {
                String key = map.getKey();
                String value;
                if (map.getValue() == null) {
                    value = "";
                } else {
                    value = map.getValue();
                }
                requestBuilder.addHeader(key, value);
            }
        }
        return requestBuilder;
    }
 
    private static FormBody.Builder getBuilder(Map<String, String> params) {
        FormBody.Builder builder = new FormBody.Builder();
        if (params == null) {
            return builder;
        }
        for (Map.Entry<String, String> map : params.entrySet()) {
            String key = map.getKey();
            String value;
            if (map.getValue() == null) {
                value = "";
            } else {
                value = map.getValue();
            }
            builder.add(key, value);
        }
        return builder;
    }
 
    public static String getRequest(String url) throws BusinessException {
        ResponseBody responseBody = null;
        try {
            OkHttpClient.Builder clientBuilder = getClientBuilder();
            Request.Builder requestBuilder = getRequestBuilder(null);
            OkHttpClient client = clientBuilder.build();
            Request request = requestBuilder.url(url).build();
            Response response = client.newCall(request).execute();
            responseBody = response.body();
            return responseBody.string();
        } catch (SocketTimeoutException | ConnectException e) {
            logger.error("OKhttp POST 請求超時,url:{}", url, e);
            throw new BusinessException(ResponseCodeEnum.CODE_900);
        } catch (Exception e) {
            logger.error("OKhttp GET 請求異常", e);
            return null;
        } finally {
            if (responseBody != null) {
                responseBody.close();
            }
        }
    }
 
    public static String postRequest(String url, Map<String, String> header, Map<String, String> params) throws BusinessException {
        ResponseBody responseBody = null;
        try {
            OkHttpClient.Builder clientBuilder = getClientBuilder();
            Request.Builder requestBuilder = getRequestBuilder(header);
            FormBody.Builder builder = getBuilder(params);
            OkHttpClient client = clientBuilder.build();
            RequestBody requestBody = builder.build();
            Request request = requestBuilder.url(url).post(requestBody).build();
            Response response = client.newCall(request).execute();
            responseBody = response.body();
            String responseStr = responseBody.string();
            return responseStr;
        } catch (SocketTimeoutException | ConnectException e) {
            logger.error("OKhttp POST 請求超時,url:{}", url, e);
            throw new BusinessException(ResponseCodeEnum.CODE_900);
        } catch (Exception e) {
            logger.error("OKhttp POST 請求異常,url:{}", url, e);
            return null;
        } finally {
            if (responseBody != null) {
                responseBody.close();
            }
        }
    }
 
    private static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return ssfFactory;
    }
 
}
 
class TrustAllCerts implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) {
    }
 
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) {
    }
 
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }
}
 
class RedirectInterceptor implements Interceptor {
 
    private static Logger logger = LoggerFactory.getLogger(RedirectInterceptor.class);
 
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        int code = response.code();
        if (code == 307 || code == 301 || code == 302) {
            //獲取重定向的地址
            String location = response.headers().get("Location");
            logger.info("重定向地址,location:{}", location);
            //重新構(gòu)建請求
            Request newRequest = request.newBuilder().url(location).build();
            response = chain.proceed(newRequest);
        }
        return response;
    }
}

2.獲取Ip地址

代碼如下(示例):這個代碼只能獲取到省份地址,具體信息請看下面的詳細(xì)訪問

public String getIpAddress(String ip){
		try {
			String url = "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=" + ip;
			String responseJson = OKHttpUtils.getRequest(url);
			if(null == responseJson){
				return Constants.NO_ADDRESS;
			}
			Map<String,String> addressInfo = JsonUtils.convertJson2Obj(responseJson,Map.class);
			return addressInfo.get("pro");
		}catch (Exception e){
			logger.error("獲取ip地址失敗",e);
		}
		return Constants.NO_ADDRESS;
	}

3.Controller層獲取Ip地址

@RequestMapping("/login")
    public String login(HttpServletRequest request){
        String ip = getIpAddr(request)
         return getIpAddress(ip);
        
}
 
/**
     * 獲取客戶端IP地址
     * 由于客戶端的IP地址可能通過多個代理層轉(zhuǎn)發(fā),因此需要檢查多個HTTP頭字段以獲取真實IP。
     * 此方法首先檢查“x-forwarded-for”頭,這是最常用的代理頭,然后嘗試其他不那么常見的頭字段。
     * 如果所有嘗試都失敗,則回退到使用請求的遠(yuǎn)程地址。
     *
     * @param request HttpServletRequest對象,用于獲取客戶端IP地址。
     * @return 客戶端的IP地址字符串。如果無法確定客戶端IP,則返回請求的遠(yuǎn)程地址。
     */
    protected String getIpAddr(HttpServletRequest request) {
        // 嘗試獲取“x-forwarded-for”頭,這是最常用的代理頭字段。
        String ip = request.getHeader("x-forwarded-for");
        // 檢查“x-forwarded-for”頭是否有效,并提取第一個IP地址。
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            // 多次反向代理后會有多個ip值,第一個ip才是真實ip
            if (ip.indexOf(",") != -1) {
                ip = ip.split(",")[0];
            }
        }
        // 如果“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_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 = request.getHeader("X-Real-IP");
        }
        // 如果所有代理頭字段都無效,回退到使用請求的遠(yuǎn)程地址作為客戶端IP。
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        // 返回獲取到的IP地址,無論它是通過代理頭還是直接從請求中獲取。
        return ip;
    }

 獲取信息如上,可以自行獲取其他信息

總結(jié)

本次項目總結(jié)如何獲取Ip地址

到此這篇關(guān)于SpringBoot項目中使用OkHttp獲取IP地址的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot OkHttp獲取IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring加載properties文件的兩種方式實例詳解

    Spring加載properties文件的兩種方式實例詳解

    這篇文章主要介紹了Spring加載properties文件的兩種方式,需要的朋友可以參考下
    2018-02-02
  • Java并發(fā)編程中的synchronized關(guān)鍵字詳細(xì)解讀

    Java并發(fā)編程中的synchronized關(guān)鍵字詳細(xì)解讀

    這篇文章主要介紹了Java并發(fā)編程中的synchronized關(guān)鍵字詳細(xì)解讀,在Java早期版本中,synchronized 屬于 重量級鎖,效率低下,這是因為監(jiān)視器鎖(monitor)是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的,Java 的線程是映射到操作系統(tǒng)的原生線程之上的,需要的朋友可以參考下
    2023-12-12
  • maven私有鏡像倉庫nexus部署使用

    maven私有鏡像倉庫nexus部署使用

    Nexus在企業(yè)開發(fā)中還是比較常用的私有倉庫管理工具,本文主要介紹了maven私有鏡像倉庫nexus部署使用,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • tk.mybatis擴(kuò)展通用接口使用詳解

    tk.mybatis擴(kuò)展通用接口使用詳解

    這篇文章主要介紹了tk.mybatis擴(kuò)展通用接口使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • MyBatisPlus 15個高級用法詳解

    MyBatisPlus 15個高級用法詳解

    MyBatis-Plus(簡稱MP)是Java后端開發(fā)中非常流行的ORM框架,它能夠簡化CRUD操作,下面給大家分享MyBatisPlus 15個高級用法,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Java中實現(xiàn)String.padLeft和String.padRight的示例

    Java中實現(xiàn)String.padLeft和String.padRight的示例

    本篇文章主要介紹了Java中實現(xiàn)String.padLeft和String.padRight,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • SpringBoot項目中如何實現(xiàn)MySQL讀寫分離詳解

    SpringBoot項目中如何實現(xiàn)MySQL讀寫分離詳解

    在高并發(fā)下需要對應(yīng)用進(jìn)行讀寫分離,配置多數(shù)據(jù)源,即寫操作走主庫,讀操作則走從庫,主從數(shù)據(jù)庫負(fù)責(zé)各自的讀和寫,緩解了鎖的爭用,提高了讀取性能,這篇文章主要給大家介紹了關(guān)于SpringBoot項目中如何實現(xiàn)MySQL讀寫分離的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 一文詳解如何使用Java打造更優(yōu)雅的AI代理

    一文詳解如何使用Java打造更優(yōu)雅的AI代理

    在人工智能(AI)代理開發(fā)的浪潮中,Python似乎一直是默認(rèn)的編程語言選擇,本文將深入探索Java如何以更少的代碼和更高的可擴(kuò)展性創(chuàng)造出更高效,更優(yōu)雅的AI代理,希望對大家有所幫助
    2025-10-10
  • Java調(diào)用Windows的DOS命令的方法

    Java調(diào)用Windows的DOS命令的方法

    這篇文章主要介紹了Java調(diào)用Windows的DOS命令的方法,其主要內(nèi)容思路是實現(xiàn)調(diào)用Windows的ipconfig命令,然后將輸出的信息通過IO流輸出到控制臺。有需要的小伙伴參考下
    2015-02-02
  • Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析

    Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析

    這篇文章主要介紹了Spring定時任務(wù)輪詢本地數(shù)據(jù)庫實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

乌鲁木齐县| 和静县| 来凤县| 平湖市| 利津县| 福鼎市| 蒙山县| 股票| 杭锦旗| 台北市| 孙吴县| 蓬莱市| 陇南市| 宁波市| 临城县| 米易县| 沧州市| 郎溪县| 都兰县| 汉寿县| 福州市| 扶余县| 布尔津县| 勃利县| 吉木乃县| 社会| 开阳县| 霍州市| 乐平市| 武乡县| 武冈市| 布尔津县| 绥化市| 洛浦县| 突泉县| 辉县市| 安岳县| 宁强县| 沧源| 阳江市| 江山市|