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() == 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.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(2000)// 设置连接超时时间,单位毫秒
            connection.setReadTimeout(3000)// 设置读取数据超时时间,单位毫秒
            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.腾讯的接口好像测试发现均被告知系统繁忙,无法提供这个服务。
新浪和淘宝的接口待以后需要时再测试!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值