public void getAddr() throws IOException { 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 = (String) request.getSession().getValue("ipAddress"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } String sql = "SELECT * FROM ipdata WHERE INET_ATON('"+ip+"')BETWEEN INET_ATON(ipstart) AND INET_ATON(ipend)"; Session session = this.ht.getSessionFactory().openSession(); List ld = session.createSQLQuery(sql).addEntity(IpData.class).list(); System.out.println(ld.size()); if(ld.size()!=0){ response.setContentType("text/html;charset=gb2312"); response.getWriter().write(ip+"%"+((IpData)(ld.get(0))).getRegion()+"-"+((IpData)(ld.get(0))).getAddress()); } session.close(); this.ht.clear();
这种方式我觉得是最土的方式,因为绝大部分网名的IP不是固定的,每次上网都是随机分配的,而纯真数据库记录的也是一个大概位置,即查询用户ip所属的ip数据段,只是将这个数据段的物理地址返回,测试中的理想很不好,很多时候都是不准确的,最离谱的一次竟然把我定位到开封(本人在郑州,使用移动网络),在数据库中查找ip数据段归属地只有一个大概地址 河南省 移动网络,,很明显 这个不是我们想要的定位效果,果断放弃,搞得很郁闷,这种方式不仅定位不准确,而且对服务器要求很高,要想想从43万条ip数据中查找一条符合自己的IP物理地址是何等的工作量,就算做了数据库优化那又如何?穷则思变,想到既然http请求得到的ip没用,那何不让用户自己定位自己,想到有专门的ip查询网站,比喻ip138.com,仿佛看到点曙光,又到网上搜索了一下,开始准备用网页抓取,让用户自己发送一条请求到ip138.com然后把请求结果重定向发送到服务器,(注明:这种方式我没做过,到底能不能做,知道的大神轻喷...)......后来看了一下也是个大概的位置,我想也是他们的数据库不行吧,如果想要得到准确的位置除非你能进入运营商的ip数据库,从他们那里得到每次ip分配出去的准确地址,想到这里我蛋疼了,神伤了.....
到这里就走了很多的弯路.......
终于....终于....噼里啪啦一声我想到了百度地图,天朝的规矩你懂的,ip数据库这种白富美我这等屌丝哪有命去用啊,但是百度就不同了,人家高富帅,想用啥那还不是说一声的事,既然不能跟着老大混,跟着老二混说不定也行(因为我就是在网站加入百度地图,然后让用户在百度地图上显示自己的位置,说到底,是要根据用户的地址定位到地图上),前面的走不通,我就琢磨先把百度地图加上去吧,然后就去啃百度地图api,以前从来就没接触过地图这东西,从头开始干,第一个helloworld代码拷下来试试,还真行,然后进入了百度地图的DEMO页面开始学,当我看到http://developer.baidu.com/map/jsdemo.htm#i8_1这个页面的时候我简直要高兴的疯了,这不就是我追求已久的浏览器定位么
,立马在地图上加上这个控件
var geoCtrl = new BMap.GeolocationControl({ showAddressBar : true //是否显示 , enableAutoLocation : false //首次是否进行自动定位 , offset : new BMap.Size(140, 0) //, locationIcon : (url)loading.gif //定位的icon图标 }); //监听定位成功事件 geoCtrl.addEventListener("locationSuccess", function(e) { console.log(e); }); //监听定位失败事件 geoCtrl.addEventListener("locationError", function(e) { console.log(e); }); // 将定位控件添加到地图 map.addControl(geoCtrl);
很蛋疼啊...走了这么多弯路,到这里发现百度早就搞出来了,回头想想自己也太高估自己了,想凭自己的ip数据库进行定位这种方式简直太鳖孙了,还是百度强大,既然百度这么大方我们也不好意思不用不是,咋有一种做老大的赶脚呢,几行代码就把百度的定位器搞到手了,这用来定位客户端的地理地址还真牛逼,加到网站测试一下定位我的位置为郑州市大学北路,我的位置显示在地图上直接到郑州大学学生宿舍七号楼,看到这里我简直激动的无以复加,这他妈的也太准确了,看看我最近的测试吧,(此次测试的位时候我在科技市场这边)
注:我就这在安利物流旁边的一栋大楼里,到这里,没什么可写的了,定位成功了
写好很久了,记得还是学生的时候写的,一直窝着没发,现在也很久没接触了,就发出来给需要的人吧