当前位置: 首页 > news >正文

品牌网站设计哪家好西安网站建设推广优化

品牌网站设计哪家好,西安网站建设推广优化,北京网站备案更换主体,温州做网站的公司一、本地解析 如果使用本地ip解析的话&#xff0c;我们将会借助ip2region&#xff0c;该项目维护了一份较为详细的本地ip地址对应表&#xff0c;如果为了离线环境的使用&#xff0c;需要导入该项目依赖&#xff0c;并指定版本&#xff0c;不同版本的方法可能存在差异。 <d…

一、本地解析

如果使用本地ip解析的话,我们将会借助ip2region,该项目维护了一份较为详细的本地ip地址对应表,如果为了离线环境的使用,需要导入该项目依赖,并指定版本,不同版本的方法可能存在差异。

<dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.6.3</version>
</dependency>

在使用时需要将xdb文件下载到resources目录下,ip2region使用完全基于xdb文件的查询,单次查询响应时间在十微秒级别:

 

package com.example.demo.utils;import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.xdb.Searcher;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;@NoArgsConstructor
@Slf4j
public class IPUtil {private static final String UNKNOWN = "unknown";private static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";private static List<String> internalIpList=new ArrayList<>();private static byte[] cBuff;{internalIpList.add("192.168.1.105");internalIpList.add("127.0.0.1");}/*** 功能:获取IP地址* 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,* X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址*/public static String getIp(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();}// 本机访问if ("localhost".equalsIgnoreCase(ip) || "127.0.0.1".equalsIgnoreCase(ip) || "0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)){// 根据网卡取本机配置的IPInetAddress inet;try {inet = InetAddress.getLocalHost();ip = inet.getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}}// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割if (null != ip && ip.length() > 15) {if (ip.indexOf(",") > 15) {ip = ip.substring(0, ip.indexOf(","));}}return ip;}public static String getIpAddrByLocal(String ip) {// 1、创建一个完全基于文件的查询对象String xdbPath = "src/main/resources/ip2region.xdb";Searcher searcher;try {searcher = Searcher.newWithFileOnly(xdbPath);}catch (Exception e) {log.error("无法创建内存的查询对象Searcher");return null;}// 2、查询try {return searcher.searchByStr(ip);} catch (Exception e) {log.error("IP地址位置查询失败(%s):%s\n",ip, e);}return null;}public static String getIpAddrByByOnline(String ip) {String address = UNKNOWN;if (internalIp(ip)) {// 判断是否是内网,如果是内网,则不进行查询,直接返回return "内网IP";}if (true) {try {String rspStr = sendGet(IP_URL, "ip=" + ip + "&json=true" ,"GBK");if (StrUtil.isBlank(rspStr)) {log.error("获取地理位置异常 {}" , ip);return UNKNOWN;}JSONObject obj = JSONUtil.parseObj(rspStr);String region = obj.getStr("pro");String city = obj.getStr("city");return String.format("%s %s" , region, city);} catch (Exception e) {log.error("获取地理位置异常:{}",ip);}}return address;}public static String sendGet(String url, String param, String contentType) {StringBuilder result = new StringBuilder();BufferedReader in = null;try {String urlNameString = url + "?" + param;log.info("sendGet - {}" , urlNameString);URL realUrl = new URL(urlNameString);URLConnection connection = realUrl.openConnection();connection.setRequestProperty("accept" , "*/*");connection.setRequestProperty("connection" , "Keep-Alive");connection.setRequestProperty("user-agent" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");connection.connect();in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));String line;while ((line = in.readLine()) != null) {result.append(line);}log.info("recv - {}" , result);} catch (ConnectException e) {log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);} catch (SocketTimeoutException e) {log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);} catch (IOException e) {log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);} catch (Exception e) {log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);} finally {try {if (in != null) {in.close();}} catch (Exception ex) {log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);}}return result.toString();}private static boolean internalIp(String ip){return internalIpList.contains(ip);}
}

特别说明:这里我们将其解析封装成一个工具类,包含获取IP和ip地址解析两个方法,ip 的解析可以在请求中获取。获取到ip后,根据ip在xdb 中查找对应的IP地址的解析,由于是本地数据库可能存在一定的缺失,部分ip 存在无法解析的情况。 

ip2region v2.0 是一个离线 IP 地址定位库和 IP 定位数据管理框架,10 微秒级别的查询效率,准提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

数据聚合了一些知名 ip 到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真 IP 定位准确一些。

备注:如果上述开放 API 或者数据都不给开放数据时 ip2region 将停止数据的更新服务。

每个ip数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其它国家部分数据只能定位到国家,后面的选项全部是0。

除了完全基于xdb文件的查询,我们还可以通过如下两种方式开启内存加速查询

第一种方式:缓存 VectorIndex 索引

我们可以提前从xdb文件中加载出来VectorIndex数据,然后全局缓存,每次创建Searcher对象的时候使用全局的VectorIndex缓存可以减少一次固定的IO操作,从而加速查询,减少IO压力。 

import org.lionsoul.ip2region.xdb.Searcher;public class Demo {public static void main(String[] args) {// 1、从dbPath中预先加载VectorIndex索引,并且把这个得到的数据进行缓存作为全局变量,后续反复使用。String dbPath = "文件路径";byte[] vIndex =new byte[10];try {vIndex = Searcher.loadVectorIndexFromFile(dbPath);} catch (Exception e) {e.printStackTrace();}// 2、使用全局的vIndex 创建带 VectorIndex 缓存的查询对象。Searcher searcher;try {searcher = Searcher.newWithVectorIndex(dbPath, vIndex);} catch (Exception e) {e.printStackTrace();}}
}

第二种方式:缓存整个 xdb 文件数据

将整个xdb文件全部加载到内存,内存占用等同于xdb文件大小,无磁盘IO操作,保持微秒级别的查询效率。 

import org.lionsoul.ip2region.xdb.Searcher;public class Demo {public static void main(String[] args) {// 1、根据dbPath直接加载整个xdb文件,并且把这个得到的数据进行缓存作为全局变量(存储到内存中)String dbPath = "文件路径";byte[] cBuff;try {cBuff = Searcher.loadContentFromFile(dbPath);} catch (Exception e) {e.printStackTrace();return;}// 2、使用上述的 cBuff 创建一个完全基于内存的查询对象Searcher searcher;try {searcher = Searcher.newWithBuffer(cBuff);} catch (Exception e) {e.printStackTrace();}}
}

二、在线解析

如果想要获取更加全面的ip地址信息,可使用在线数据库,这里提供的是whois.pconline.com的IP解析,该IP解析在我的使用过程中表现非常流畅,而且只有少数的ip存在无法解析的情况。

特别说明:示例代码在上面

三、应用场景

那么在项目的什么流程获取ip地址是比较合适的,这里就要用到我们的拦截器了。拦截进入服务的每个请求,进行前置操作,对请求头的解析,获取ip以及ip属地。

import com.example.demo.utils.IPUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Slf4j
@Configuration
public class IpUrlLimitInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) {/*** 第一种方式:通过本地获取IP的具体地址*///String ip = IPUtil.getIp(httpServletRequest);//String addr = IPUtil.getIpAddrByLocal(ip);//String url = httpServletRequest.getRequestURI();/*** 第二种方式: 通过在线库获取*/String ip = IPUtil.getIp(httpServletRequest);String addr = IPUtil.getIpAddrByByOnline(ip);String url = httpServletRequest.getRequestURI();return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate IpUrlLimitInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor);}
}

文章转载自:
http://breen.nrpp.cn
http://vasoconstricting.nrpp.cn
http://inferno.nrpp.cn
http://heritability.nrpp.cn
http://whippletree.nrpp.cn
http://ocular.nrpp.cn
http://aviate.nrpp.cn
http://uft.nrpp.cn
http://dismount.nrpp.cn
http://subdelegate.nrpp.cn
http://concordancy.nrpp.cn
http://kweilin.nrpp.cn
http://sonless.nrpp.cn
http://aerobiologic.nrpp.cn
http://larkspur.nrpp.cn
http://evolution.nrpp.cn
http://pericarditis.nrpp.cn
http://brainless.nrpp.cn
http://wallflower.nrpp.cn
http://infieldsman.nrpp.cn
http://hubbly.nrpp.cn
http://widdle.nrpp.cn
http://drubbing.nrpp.cn
http://stalingrad.nrpp.cn
http://silly.nrpp.cn
http://studied.nrpp.cn
http://homopolymer.nrpp.cn
http://camp.nrpp.cn
http://oliver.nrpp.cn
http://doghouse.nrpp.cn
http://messianism.nrpp.cn
http://cowhage.nrpp.cn
http://hydrometry.nrpp.cn
http://soft.nrpp.cn
http://newmown.nrpp.cn
http://deconcentrate.nrpp.cn
http://nonpasserine.nrpp.cn
http://examen.nrpp.cn
http://imbecile.nrpp.cn
http://informative.nrpp.cn
http://lease.nrpp.cn
http://typhlosis.nrpp.cn
http://annihilate.nrpp.cn
http://fluoresce.nrpp.cn
http://throat.nrpp.cn
http://serotaxonomy.nrpp.cn
http://trinitrocresol.nrpp.cn
http://creamery.nrpp.cn
http://breeks.nrpp.cn
http://pigeontail.nrpp.cn
http://greenstuff.nrpp.cn
http://geist.nrpp.cn
http://fth.nrpp.cn
http://orangeade.nrpp.cn
http://abbreviatory.nrpp.cn
http://drape.nrpp.cn
http://seminomad.nrpp.cn
http://nomen.nrpp.cn
http://returnee.nrpp.cn
http://arboreous.nrpp.cn
http://lymphogranuloma.nrpp.cn
http://chowder.nrpp.cn
http://qcd.nrpp.cn
http://coalbox.nrpp.cn
http://tiffany.nrpp.cn
http://roar.nrpp.cn
http://redetermine.nrpp.cn
http://dinaric.nrpp.cn
http://profession.nrpp.cn
http://mucus.nrpp.cn
http://invalid.nrpp.cn
http://frills.nrpp.cn
http://chatelet.nrpp.cn
http://unipole.nrpp.cn
http://requicken.nrpp.cn
http://zetz.nrpp.cn
http://srs.nrpp.cn
http://tardive.nrpp.cn
http://ozocerite.nrpp.cn
http://mythopoetize.nrpp.cn
http://nocturn.nrpp.cn
http://hutted.nrpp.cn
http://larceny.nrpp.cn
http://katabatic.nrpp.cn
http://halter.nrpp.cn
http://semiferal.nrpp.cn
http://primal.nrpp.cn
http://teentsy.nrpp.cn
http://calzada.nrpp.cn
http://amphimictic.nrpp.cn
http://microlens.nrpp.cn
http://limonitic.nrpp.cn
http://miserliness.nrpp.cn
http://proustite.nrpp.cn
http://coenenchyma.nrpp.cn
http://barroque.nrpp.cn
http://antenniform.nrpp.cn
http://plagiocephalism.nrpp.cn
http://nolpros.nrpp.cn
http://carpogonium.nrpp.cn
http://www.dt0577.cn/news/83715.html

相关文章:

  • 专业做室内设计的网站有哪些国内十大搜索引擎网站
  • layui做移动网站郑州seo排名优化
  • 自己建网站买玩具现在推广引流什么平台比较火
  • 河南省网站建设网站免费推广软件
  • 三亚按下了暂停键学seo哪个培训好
  • flash网站优化室内设计网站
  • 唐山做网站口碑好的模板建站网页
  • 网站备案电话福州短视频seo
  • 网站开发基础课程百度账号一键登录
  • 做发票网站厦门百度seo公司
  • 一级a做爰片免费无码网站网络广告宣传平台
  • 石家庄网站建设国外媒体报道
  • 网站开发环境有什么百度下载安装到桌面
  • 网站内容编辑工具重庆百度总代理
  • 哪些网站做简历合适推广网站要注意什么
  • 石家庄网站建设蓝点iis搭建网站
  • 网站维护指导谷歌广告优化师
  • 网站开始开发阶段的主要流程武汉网站优化
  • 安徽专业做网站的大公司seo整站优化服务
  • 深圳做专业网站新郑网络推广
  • 有没有代做ppt的网站网络营销的方式和方法
  • wordpress文章双语网站seo优化建议
  • 宝塔wordpress固定连接重庆seo建站
  • 工业皮带怎么做免费的网站谷歌搜索引擎免费入口 香港
  • 做效果图比较好的模型网站网络广告的形式有哪些?
  • 拓者设计吧网站网络游戏推广
  • 做个商城网站要多少钱站长工具seo优化
  • 网站制作.com语言杭州网站优化培训
  • 北京市城乡建设学校网站淮北seo
  • 石家庄网站设计工作室廊坊快速排名优化