SpringBoot+Echarts用户访问地图可视化
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、成都网站设计、广水网络推广、小程序制作、广水网络营销、广水企业策划、广水品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供广水建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
意义
根据ip获取城市的方式
思路
首先需要获取用户请求的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
visitCount; - private static final QQWry qqWry;
- static {
- visitCount = new HashMap<>(31);
- qqWry = new QQWry();
- }
- //展示访问数量不是精确指标,如果要做到完全正确需要使用锁,防止计数存在并发问题
- @Override
- public 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;
- }
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response,
- Object handler, ModelAndView modelAndView) throws Exception {}
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
- Object handler, Exception ex){}
- }
注册自定义的拦截器
- @Configuration
- public class WebMvcConfig implements WebMvcConfigurer {
- @Override
- public 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
新闻名称:炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)
文章URL:http://www.shufengxianlan.com/qtweb/news34/190634.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联