点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

SpringBoot+Echarts用户访问地图可视化

意义

  • 在常见的电商、新闻、社交网站等,合理运用运营成本才能最大化输出自己的产品,其中最常见的功能就有针对不同访问热度的城市制定不同的运营手段,因此我们掌握用户城市分布情况至关重要。

  • pc端与移动端不同,无法依托手机自带的gps定位到用户所在城市,只能通过ip来进行判断所在地理位置。

根据ip获取城市的方式

  • 淘宝、新浪等常年提供根据ip获取城市的接口,但是隔一段时间会出现接口地址更改的情况,也有一定的限流

  • 开源纯真ip库:不断迭代更新ip库内容,一般场景下足以使用,自主可控。(下载qqwry.dat库)

思路

首先需要获取用户请求的ip地址,我们对该方法进行简单封装:

public class IPUtil {public static String getIpAddress(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;}
}

封装纯真ip的解析工具,根据ip获取请求地址所在城市,github有大量实现版本,我们这里不做赘述,具体代码见文末源码

//篇幅较长,截取的主要方法,详细在源码地址查看
public IPZone findIP(final String ip) {final long ipNum = toNumericIP(ip);final QIndex idx = searchIndex(ipNum);if (idx == null) {return new IPZone(ip);}return readIP(ip, idx);
}

自定义拦截器,对用户的登录请求进行拦截,在此处判断请求ip所在城市,并进行计数。我们这里只是简单逻辑的说明,在生产上时应该用redis来存放计数,并且专门提供一个rest接口来推送当前各城市访问数量情况,再由前端配合,隔一段时间发起一次请求,例如隔一小时请求一次该rest接口,从而进行前端数据的展示。

/*** 登录拦截器*/
@Slf4j
public class MyLoginInterceptor implements HandlerInterceptor {private static final String LOGIN_PATH = "/user/login";private static Map<String, AtomicInteger> visitCount;private static final QQWry qqWry;static {visitCount = new HashMap<>(31);qqWry = new QQWry();}//展示访问数量不是精确指标,如果要做到完全正确需要使用锁,防止计数存在并发问题@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("【MyLoginInterceptor】调用了:{}", request.getRequestURI());if (request.getRequestURI().equals(LOGIN_PATH)) {String ipAddress = IPUtil.getIpAddress(request);String province = qqWry.findIP(ipAddress).getMainInfo();if (visitCount.containsKey(province)) {visitCount.put(province,new AtomicInteger(visitCount.get(province).incrementAndGet()));} else {visitCount.put(province,new AtomicInteger());}}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex){}
}

注册自定义的拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyLoginInterceptor());}
}

登录controller模拟逻辑,注意:如果想看效果图需要自己写线程用不同的虚拟ip进行访问url,从而达到在不同城市访问接口的效果。

@RestController("user")
public class LoginController {@GetMapping("login")public String login() {//登录逻辑return "success";}
}

最终效果

前后端源码

https://github.com/Motianshi/distribute-tool
热门内容:API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现
为什么 SQL 语句不要过多的 join?
前后端分离 Spring Boot + Vue 开发网易云&QQ音乐(附源码)!fastjson到底做错了什么?为什么会被频繁爆出漏洞?
用 float 存储金额,老板说损失从工资里扣!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)相关推荐

  1. 14款CSS3炫酷表单input输入框美化效果【附源码】

    这是一款效果非常酷的CSS3表单input输入框美化效果插件.为表单的input输入框制作一些特殊的效果能给用户带来更好的用户体验.这个CSS3表单input输入框美化插件就是一个很好的例子.这个插件 ...

  2. 炫酷的jQuery手风琴图片和菜单插件及源码

    手风琴效果的应用非常广泛,我们常见的有手风琴图片切换和手风琴菜单,同时它也是焦点图的一种展现形式之一.今天我们就来分享一些基于jQuery的手风琴图片和菜单插件,并提供源代码下载,一起来看看吧. 1. ...

  3. java计算机毕业设计BS用户小票系统(附源码、数据库)

    java计算机毕业设计BS用户小票系统(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe( ...

  4. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot使用Netty集成protobuf开发高性能服务器 文章目录 Springboot-cli 开发脚手架系列 简介 1. ...

  5. 微信小程序自带地图_小程序丨教你:如何打开小程序如何打开微信自带的地图(附源码)...

    教你小程序系列教程:教你小程序系列教程: 1.教你:微信小程序如何实现scroll-view隐藏滚动条 2.教你:如何使用scroll-view组件实现视图垂直滚动(附源码) 3.教你:小程序如何使用 ...

  6. antdesign 地图_“炫酷狂拽”的 AntV - L7 地图可视化设计

    导读 随着多媒体技术的发展,数据可视化呈现越来越丰富的多维度表达,尤其三维技术的成熟,给了可视化更多的想象空间,呈现出百花齐放的地理可视化景象,各类模拟城市应用则是在地理可视化领域的强劲运用,在惊叹空 ...

  7. echarts asp mysql 源码_如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)...

    ECharts地图主要用于地理区域数据的可视化,展示不同区域的数据分布信息.ECharts官网提供了中国地图.世界地图等地图数据下载,通过js引入或异步加载json文件的形式调用地图. 本文将结合实例 ...

  8. SpringBoot学生信息管理系统_毕业设计(附源码)

    项目简介 基本功能 学生信息管理,增删改查,以及文件备份,批量注册,前后端同时校验数据,将异常数据响应给用户. 用户信息管理,对于角色控制,用户状态的控制. 课程信息管理,课程相关管理. 公告管理,发 ...

  9. springboot+高校教室排课系统 毕业设计-附源码221556

    springboot高校教室排课系统的设计与实现 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件 ...

最新文章

  1. java解析页面table表格内容导出为excel
  2. 【C++】31. Boost::circular_buffer——循环缓冲区
  3. CDH 版本 Kafka 外网设置
  4. [前端]多线程在前端的应用——Javascript的线程
  5. uva 714 Copying Books
  6. 宋宝华:深入理解cache对写好代码至关重要(上)
  7. 手游无限多开器安卓版_无限多开版!使用叶子猪手游模拟器玩大话西游手游教程...
  8. Alibaba之EasyExcel使用
  9. 惠斯特电桥平衡条件的证明
  10. 数字化转型没有银弹,不破不立,如何破?如何立?
  11. gprs java_GPRS类型一览
  12. LR(1)分析法的总控的实现(C++实现)
  13. java中整数的整数次方_数值的整数次方
  14. 拓嘉辰丰电商:拼多多新品适合场景推广还是搜索推广
  15. PR模板如何使用?Premiere模板如何替换图片、视频及文字的PR模板使用教程
  16. 做网站时域名应该怎么选择
  17. AI:大模型领域最新算法SOTA总结、人工智能领域AI工具产品集合分门别类(文本类、图片类、编程类、办公类、视频类、音频类、多模态类)的简介、使用方法(持续更新)之详细攻略
  18. xml 操作unity 的文档
  19. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计
  20. 空头来势汹汹,多头节节败退

热门文章

  1. MySQL图形处理软件Navicat字体配置(乱码解决)
  2. Java 处理0x00特殊字符
  3. css中position的几个值
  4. hp-ux 集群,内存 小记
  5. jQuery的文档操作方法
  6. Delphi实现WebService带身份认证的数据传输
  7. Task05:青少年软件编程(Scratch)等级考试模拟卷(一级)
  8. 刻意练习:LeetCode实战 -- Task27.分发饼干
  9. 【机器学习】基于粒子群算法的非线性函数寻优
  10. 用 Python 制作可视化报表,这也太快了!