【Servlet】Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地

这里之所以调用新浪api接口,主要是可以避免我们在本地存放一个ip归属地库,

同时,我们在本地要存放用户的ip,仅仅存放其ip就可以了,无须存放其归属地,节省一个字段。

如下图,写一个带有获取客户端IP地址的网页:

首先,在Eclipse的目录结构如下:

里面除了servlet的支持包之外,就一个.jsp与一个.java。

其中这里用到Servlet3.0,因此web.xml没有任何东西:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">

</web-app>

之后,index.jsp通过Javascript的Ajax,向ipGetTest.java中获取相应的Json。Javascript与Servlet的交互原理已经在《【Servlet】Servlet3.0与纯javascript通过Ajax交互》(点击打开链接)中说过了,这里不再赘述!以下是index.jsp中的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Javaweb-IP查询</title>
</head>

<body>
	<p>IP:<span id="ip"></span></p>
	<p>IP归属地:<span id="area"></span></p>
</body>
</html>
<script>
	//创建Ajax对象,不同浏览器有不同的创建方法,其实本函数就是一个简单的new语句而已。
	function createXMLHttpRequest() {
		var XMLHttpRequest1;
		if (window.XMLHttpRequest) {
			XMLHttpRequest1 = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			try {
				XMLHttpRequest1 = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				XMLHttpRequest1 = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
		return XMLHttpRequest1;
	}
	function ajax() {
		var XMLHttpRequest1 = createXMLHttpRequest();
		//指明相应页面
		var url = "./ipGetTest";
		XMLHttpRequest1.open("POST", url, true);
		//这里没法解释,你所有JavaScript的请求头都这样写就对了,不会乱码
		XMLHttpRequest1.setRequestHeader("Content-Type",
				"application/x-www-form-urlencoded");
		//对于ajaxRequest,本js.html将会传递param1与param2给你。
		XMLHttpRequest1.send(null);
		//对于返回结果怎么处理的问题
		XMLHttpRequest1.onreadystatechange = function() {
			//这个4代表已经发送完毕之后
			if (XMLHttpRequest1.readyState == 4) {
				//200代表正确收到了返回结果
				if (XMLHttpRequest1.status == 200) {
					//json返回结果
					var data=eval("("+XMLHttpRequest1.responseText+")");
					document.getElementById("ip").innerHTML=data.ip;
					document.getElementById("area").innerHTML=decodeURIComponent(data.area1)+decodeURIComponent(data.area2);
				} else {
					//如果不能正常接受结果,你肯定是断网,或者我的服务器关掉了。
					alert("网络连接中断!");
				}
			}
		};
	}
	ajax();
</script>

index.jsp将会从ipGetTest.java中获取如下的Json:

其中http://ipapi.sinaapp.com/api.php?f=text&ip=xxx这个新浪的api,如果f=text则返回文本信息,如果时f=json则返回json字符串,当然这个json字符串还需要自己如上代码所示地,需要通过decodeURIComponent讲utf-8编码,搞成中文。

这里的起始地址与结束地址,就是该网段ip的起始地址与结束地址。

关键是ipGetTest.java这个文件,这个文件分三步,首先通过request对象,获取用户访问的IP,之后通过Java向远程获取数据的技术获取网页内容。

获取到的文本信息,直接打印到控制台,获取到Json信息直接打印到这个Servlet上面。

package ipGet;

import java.io.*;
import java.net.URL;
import java.util.Scanner;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "ipGetTest", urlPatterns = { "/ipGetTest" })
public class ipGetTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private Scanner scanner;

	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 这两行是为了这个Servlet能够正常打印数据的
		PrintStream out = new PrintStream(response.getOutputStream());
		response.setContentType("text/html;charSet=utf-8");
		// 获取客户端ip
		String ip = "";
		if (request.getHeader("x-forwarded-for") == null) {
			ip = request.getRemoteAddr();
		} else {
			ip = request.getHeader("x-forwarded-for");
		}
		System.out.print("你的ip为:" + ip + "\n");
		// 获取ip归属地的文本信息
		StringBuilder ipText = new StringBuilder("");
		String url = "http://ipapi.sinaapp.com/api.php?f=text&ip=" + ip;
		scanner = new Scanner(new URL(url).openConnection().getInputStream(),
				"utf-8");
		while (scanner.hasNext()) {
			ipText.append(scanner.next());
		}
		System.out.println(ipText);
		// 获取ip归属地的json信息
		StringBuilder ipJson = new StringBuilder("");
		url = "http://ipapi.sinaapp.com/api.php?f=json&ip=" + ip;
		scanner = new Scanner(new URL(url).openConnection().getInputStream(),
				"utf-8");
		while (scanner.hasNext()) {
			ipJson.append(scanner.next());
		}
		out.println(ipJson);

	}

}

由于只能通过服务器语言才能获取到客户端的IP,因此,只能这样搞。

这里Java获取远程信息,通过《【Java】打印流与缓冲区读者完成输入与输出到文件操作》(点击打开链接)中使用Scanner的方法改造了《【Java】读取网页中的内容》(点击打开链接)中通过缓冲区读者的方式来获取远程信息。

时间: 2024-10-15 00:25:24

【Servlet】Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地的相关文章

【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地

本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得到客户端的ip,并获取利用新浪api接口获取此ip的归属地. 可以看到,在IE6也是相当正常的. 目录结构如下,非常简单,同样就两个文件,其实如果你愿意,写成一个php文件也可以,但是显示层和逻辑业务层还是不混在一起为好吧? 唯一值得注意的是,这两个文件打死也不能一个叫ipGet.php,ipGet.html

Python如何调用新浪api接口的问题

前言:这些天在研究如何调用新浪开放平台的api分析新浪微博用户的数据 成果:成功调用了新浪api获取了用户的一些个人信息和无数条公共微博 不足:新浪开放平台访问有限制,返回的数据着实有限,不足以分析问题,真的要分析问题还是得个人写爬虫 下面是调用新浪开放api的过程: 第一步:按这个做就行 http://www.cnblogs.com/dhsunny/p/3578399.html?utm_source=tuicool&utm_medium=referral 其中有一不那个新浪api测试工具是打不

php利用新浪接口查询ip获取地理位置示例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php function getIPLoc_sina($queryIP){   $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip='.$queryIP;   $ch = curl_init($url);    curl_setopt($ch,CURLOPT_ENCODING ,'utf8');

Pipelines - .NET中的新IO API指引(三) 边看边记

Pipelines - .NET中的新IO API指引 作者 marcgravell  原文 此系列前两篇网上已有的译文 Pipelines - .NET中的新IO API指引(一) Pipelines - .NET中的新IO API指引(二) 关于System.IO.Pipelines的一篇说明 System.IO.Pipelines: .NET高性能IO 本篇不是翻译,边看边译边记而已. System.IO.Pipelines 是对IO的统一抽象,文件.com口.网络等等,重点在于让调用者注

新浪支付接口对接的总结

最近公司用户了新浪支付,账户托管,写的过程中发现有问题的话百度很少就记录下自己疑惑的地方 1.接口介入方式 这种接口介入的方式,各大平台都差不多的,支付宝啊,微信支付啊,融宝支付啊,银盈通啊.都是系统必要的参数,和接口需要的参数,拼一起然互加密. 新浪支付生成 sign 的方式,签名的方式可以是 RSA 的加密方式和 MD5 的加密的方式,不过新浪推荐的是MD5的加密方式,但是给的demo里面是RSA的方式,所有自己用的 也会是RSA的加密方式. 简单的例子   创建激活会员 public st

web 工程中利用Spring的 ApplicationContextAware接口自动注入bean

最常用的办法就是用 ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 等对象去加载Spring配置文件,这样做也是可以, 但是在加载Spring配置文件的时候,就会生成一个新的ApplicaitonContext对象而不是Spring容器帮我们生成的哪一个, 这样就产生了冗余, 所以不采用应用程序手动加载文件的方式,而是使用Applic

【转载】利用新浪博客建设网站外链

当今网络管理机制越来越完善,允许发外接的网站越来越少,建设网站外链变得越来越困难,今天和大家分享一篇文章,告诉你如何利用新浪博客建设网站外键. 目前国内知名的博客平台有QQ.网易.新浪.搜狐.百度等,先来分析一下为什么我为什么选择新浪博客建设网站外链? 腾讯博客(QQ空间)是不被搜索引擎收录的,所以直接淘汰. 网易博客使用的是三级域名,即使成功建设外链权重也不高. 百度博客(百度HI)即将要关闭了,完全是浪费时间. 搜狐博客也是使用三级域名,权重并不高. 新浪博客的内容页使用 blog.sina

淘宝(新浪)API获取IP地址位置信息

1 package com.parse; 2 3 import java.io.BufferedReader; 4 import java.io.DataOutputStream; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.UnsupportedEncodingException; 8 import java.net.HttpURLConnection; 9 import

【API】新浪天气接口 Beta

新浪天氣接口那是公認的好,可是百度之後發現很簡陋,所以自己寫了工具類,此處幫忙測試下其中的天氣接口,看有哪些地方要改進的. Jar 名称:          NonentityUtil Class 名称:       SinaWeatherUtil,新浪天氣 Util 類 方法名:            getWeatherByCity(String city,int forecastDays),根據城市獲取天氣 輸入參數:         city,城市,拼音或者漢語([BUG]輸入拼音返回的