SpringBoot + Echarts se da cuenta de la visualización del mapa de acceso del usuario

En el comercio electrónico común, noticias, sitios de redes sociales, etc., el uso racional de los costos operativos puede maximizar la producción de sus productos. La función más común es desarrollar diferentes métodos operativos para ciudades con diferentes visitas. Por lo tanto, tenemos un conocimiento de la distribución de usuarios en las ciudades. Vital.

El terminal de PC es diferente al terminal móvil, no puede depender del GPS del teléfono móvil para localizar la ciudad del usuario y solo puede juzgar la ubicación geográfica a través de la IP.

Como llegar a la ciudad segun ip

Taobao, Sina, etc.proporcionan interfaces para obtener ciudades basadas en ip durante todo el año, pero la dirección de la interfaz puede cambiar cada dos veces, y también existen ciertos límites actuales

Biblioteca de ip inocente de código abierto: actualice iterativamente el contenido de la biblioteca de ip, que es suficiente para su uso en escenarios generales y se puede controlar de forma independiente. (Descargue la biblioteca qqwry.dat )

Ideas

Primero, necesitamos obtener la dirección IP solicitada por el usuario, simplemente encapsulamos el método:

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;
    }
}

 

Una herramienta de análisis para encapsular ip inocente, según la ciudad donde se obtiene la dirección solicitada por ip, github tiene una gran cantidad de versiones de implementación, no entraremos en detalles aquí, vea el código fuente al final del artículo

//篇幅较长,截取的主要方法,详细在源码地址查看 
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);
}

Interceptor personalizado, intercepta la solicitud de inicio de sesión del usuario, juzga la ciudad donde se encuentra la IP solicitada aquí y cuéntala. Aquí somos solo una explicación lógica simple. Redis debe usarse para almacenar el recuento durante la producción, y debe proporcionarse una interfaz de descanso para impulsar el número actual de visitas en cada ciudad, y luego el front-end cooperará para iniciar una solicitud a intervalos, por ejemplo, cada hora Solicite la interfaz restante una vez para mostrar los datos del front-end.

/**
 * 登录拦截器
 */
@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();
    }

    //展示访问数量不是精确指标,如果要做到完全正确需要使用锁,防止计数存在并发问题
    @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){}
}

Registrar un interceptor personalizado

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

 

Inicie sesión en la lógica de simulación del controlador Nota: Si desea ver las representaciones, debe escribir su propio hilo y usar diferentes ips virtuales para acceder a la URL, para lograr el efecto de acceder a interfaces en diferentes ciudades.

@RestController("user")
public class LoginController {

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

efecto final

SpringBoot + Echarts se da cuenta de la visualización del mapa de acceso del usuario

 

Obtenga el código fuente de front y back end

Sígueme para agregar el asistente VX: MXW5308 para obtener la dirección de fuente visual de forma gratuita

Supongo que te gusta

Origin blog.csdn.net/weixin_45132238/article/details/109289028
Recomendado
Clasificación