百度地图学习笔记---ip定位

最近在网站想要做一个用户IP定位的模块,在网上搜索了很多资料,五花八门,开始走了个弯路,也是在网上看到的,抓取用户的ip地址,然后在纯真数据库中搜索,这种方法太费劲,搞了几天才搞出来,既然写了这种方式也介绍下吧,这种方法就是在用户打开一个页面的时候,比喻说打开的是index.jsp,在这个页面我们可以做掉手脚,让页面加载完成之后自动向服务器发送一条http请求,这个很容易做吧,写一个onload函数,让它偷偷摸摸的做就行了 安静,然后在服务器端接收http请求,这里我们就可以得到发送http请求的客户发IP,然后根据得到的ip在数据库中查找这个ip的归属地,把归属地返回就行了。
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数据库进行定位这种方式简直太鳖孙了,还是百度强大,既然百度这么大方我们也不好意思不用不是,大笑咋有一种做老大的赶脚呢,几行代码就把百度的定位器搞到手了,这用来定位客户端的地理地址还真牛逼,加到网站测试一下定位我的位置为郑州市大学北路,我的位置显示在地图上直接到郑州大学学生宿舍七号楼,看到这里我简直激动的无以复加,这他妈的也太准确了,看看我最近的测试吧,(此次测试的位时候我在科技市场这边)百度地图学习笔记---ip定位_第1张图片注:我就这在安利物流旁边的一栋大楼里,到这里,没什么可写的了,定位成功了


写好很久了,记得还是学生的时候写的,一直窝着没发,现在也很久没接触了,就发出来给需要的人吧

你可能感兴趣的:(百度地图)