天天看點

java擷取遠端ip并根據ip得到詳細位址資訊

**文章内容是通過他人部落格内容改寫的,僅供自己後續開發時使用。侵删!**
           

1.通過HttpServletRequest擷取遠端IP位址(方法一般寫在service裡供調用)

引入包:import javax.servlet.http.HttpServletRequest

public static String getRemoteIp(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For")
        if (ip == null || ip.length() ==  || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP")
        }
        if (ip == null || ip.length() ==  || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP")
        }
        if (ip == null || ip.length() ==  || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP")
        }
        if (ip == null || ip.length() ==  || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR")
        }
        if (ip == null || ip.length() ==  || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr()
        }
        return ip
    }
           

2.根據IP位址得到詳細位址資訊(項目基于grails架構來寫的,是以語言采用groovy)

package ***

import grails.converters.JSON
import grails.transaction.Transactional

@Transactional
class LoginService {
    def configService

    def getAddressByIP(String content, String encodingString) {//content 請求的參數 格式為:name=xxx&pwd=xxx , encodingString  伺服器端請求編碼。如GBK,UTF-8等
        //預設是調用淘寶的接口
        String urlStr = "http://ip.taobao.com/service/getIpInfo.php" //根據項目需要寫入配置檔案
        String returnStr = getResult(urlStr, content, encodingString)
        if (returnStr != null) {
            // 處理傳回的省、市資訊
            def result = JSON.parse(returnStr)
            def data = result.data
            String address = data.region + data.city
            return address
        }
        return null
    }

    def getResult(String urlStr, String content, String encodingString) {
        URL url = null
        HttpURLConnection connection = null
        try {
            url = new URL(urlStr)
            connection = (HttpURLConnection) url.openConnection()// 建立連接配接執行個體
            connection.setConnectTimeout()// 設定連接配接逾時時間,機關毫秒
            connection.setReadTimeout()// 設定讀取資料逾時時間,機關毫秒
            connection.setDoOutput(true)// 是否打開輸出流 
            connection.setDoInput(true)// 是否打開輸入流
            connection.setRequestMethod("POST")// 送出方法POST|GET
            connection.setUseCaches(false)// 是否緩存
            connection.connect()// 打開連接配接端口
            DataOutputStream out = new DataOutputStream(connection.getOutputStream())// 打開輸出流往對端伺服器寫資料
            out.writeBytes(content) // 寫資料,也就是送出你的表單 name=xxx&pwd=xxx
            out.flush()// 重新整理
            out.close()// 關閉輸出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encodingString))
            // 往對端寫完資料對端伺服器傳回資料,以BufferedReader流來讀取
            StringBuffer buffer = new StringBuffer()
            String len = ""
            while ((len = reader.readLine()) != null) {
                buffer.append(len)
            }
            reader.close()
            return buffer.toString()
        } catch (IOException e) {
            e.printStackTrace()
        } finally {
            if (connection != null) {
                connection.disconnect()// 關閉連接配接
            }
        }
        return null
    }
}
           

通過淘寶的擷取ip位置接口,傳入IP為125.118.248.14時,上面傳回的資訊result列印出來的結果:

[code:0, data:[area:華東, country:中國, isp_id:100017, city:杭州市, isp:電信, ip:125.118.248.14, region_id:330000, county:, area_id:300000, county_id:-1, region:浙江省, country_id:CN, city_id:330100]]

用json處理完後根據需要自己提取所需資訊,本人項目中僅用到了region(省)和city(市)

淘寶的接口:http://ip.taobao.com/service/getIpInfo.php?ip=

新浪的接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=

騰訊的接口:http://ip.qq.com/cgi-bin/searchip?searchip=

傳回的處理結果均不同:

1.淘寶的接口可直接使用上面的代碼編寫

2.新浪的接口測試後發現編碼為utf-8時亂碼,gbk是是中文,但是傳回結果也不好用

3.騰訊的接口好像測試發現均被告知系統繁忙,無法提供這個服務。

新浪和淘寶的接口待以後需要時再測試!