真正的用户行为分析肯定是基于大数据来实现的,但是由于篇幅原因,我们就用最简单的方式来实现。
我们后台采用的是SpringBoot+MyBatis+MySQL。

  • EventsMapper.java
  • EventsDomain.java
  • EventsService.java
  • EventsServiceImpl.java
  • EventsMapper.xml

这些文件大家应该都会写,我们这里只看

  • events.sql

  • EventsConroller

  • events.sql

CREATE TABLE `ubap_events` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`event_type` varchar(128) COLLATE utf8_bin NOT NULL COMMENT '事件类型',`user_id` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '用户id',`distinct_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT '用户标识',`event_date` date NOT NULL COMMENT '日期',`event_time` datetime NOT NULL COMMENT '时间',`manufacturer` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '设备制造商',`model` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '设备型号',`os` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '操作系统',`os_version` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '操作系统版本',`browser` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '浏览器名',`browser_version` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '浏览器版本',`network_type` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '网络类型',`referrer` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '前向地址',`referrer_host` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '前向域名',`url` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '页面地址',`url_path` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '页面路径',`title` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '页面标题',`resolution` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '分辨率',`screen_color_dept` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '颜色深度',`view_height` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '视图高度',`su_cookie` smallint(6) DEFAULT NULL COMMENT '是否支持Cookie',`su_java` smallint(6) DEFAULT NULL COMMENT '是否支持java',`lan_type` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '语言种类',`redirect_count` int(11) DEFAULT NULL COMMENT '重定向次数',`nav_type` smallint(6) DEFAULT NULL COMMENT '导航类型',`bettery_level` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '电池状态',`view_time` int(11) DEFAULT NULL COMMENT '浏览时间',`open_time` datetime DEFAULT NULL COMMENT '打开时间',`colose_time` datetime DEFAULT NULL COMMENT '关闭时间',`ip` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'ip地址',`country` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '国家',`region` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '省',`city` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '市',`isp` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '运营商',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='事件表';
  • EventsController.java
/***  接收js脚本采集的数据* @param args 请求参数* @param request* @param response*/@RequestMapping("/web/xy.gif")public void catchWebBaseData(String args, HttpServletRequest request, HttpServletResponse response) {//解析参数,将数据存入Map集合Map<String, String> map = new HashMap<>();String[] strArrayAll = args.split("&");for (String current : strArrayAll ) {String[] strArray = current.split("=", 2);if(strArray.length>1) {map.put(strArray[0] , strArray[1]);} else {map.put(strArray[0] , "");}}UbapEvents ubapEvents = new UbapEvents();ubapEvents.setEventType("PageView");// 事件类型ubapEvents.setUserId("");// 用户idString cvalue = ""; //用户标识if(CookieUtils.getCookie(request,cookieName) == null) {cvalue = UUID.randomUUID().toString();CookieUtils.addCookie(response, cookieName, cvalue);} else {cvalue = CookieUtils.getCookie(request,cookieName);}ubapEvents.setDistinctId(cvalue);// 用户标识ubapEvents.setEventDate(DateUtils.getNowDate()); // 日期ubapEvents.setEventTime(DateUtils.getNowDate()); // 时间/*解析UserAgent*/UserAgentInfo userAgentInfo = UserAgentUtils.getUserAgentInfo(request.getHeader("User-Agent"));ubapEvents.setManufacturer(""); // 设备制造商ubapEvents.setModel(""); // 设备ubapEvents.setOs(userAgentInfo.getOsName()); // 操作系统名称ubapEvents.setOsVersion("");// 操作系统版本ubapEvents.setBrowser(userAgentInfo.getUaFamily()); // 浏览器名称ubapEvents.setBrowserVersion(userAgentInfo.getBrowserVersionInfo()); //浏览器版本String referrer =  map.get("referrer");String url = map.get("url");try {if (referrer != null && referrer != "") {//String referreHost = new URL(referrer).getHost();ubapEvents.setReferrer(referrer); // 前向地址//ubapEvents.setReferrerHost(referreHost); // 前向域名}if (url != null && url != "") {String urlHost = new URL(url).getHost();ubapEvents.setReferrer(url); // 地址ubapEvents.setReferrerHost(map.get("domain")); // 域名}}catch (MalformedURLException e) { // 未知协议e.printStackTrace();}System.out.println(args);ubapEvents.setTitle(map.get("title")); // 页面标题ubapEvents.setResolution(map.get("resolution")); // 分辨率ubapEvents.setScreenColorDept(map.get("screenColorDept")); // 颜色深度ubapEvents.setViewHeight(map.get("viewHeight")); // 视图高度ubapEvents.setSuCookie(Integer.parseInt(map.get("suCookie"))); // 是否支持CookieubapEvents.setSuJava(Integer.parseInt(map.get("suJava"))); // 是否支持JavaubapEvents.setLanType(map.get("language"));ubapEvents.setRedirectCount(Integer.parseInt(map.get("redirectCount"))); // 重定向次数ubapEvents.setNavType(Integer.parseInt(map.get("navType"))); // 导航类型ubapEvents.setBetteryLevel(map.get("betteryLevel")); // 电池电量int viewTime = Integer.parseInt(map.get("second"));ubapEvents.setViewTime(viewTime); // 浏览时间ubapEvents.setColoseTime(DateUtils.getNowDate()); // 关闭时间ubapEvents.setOpenTime(new Date(System.currentTimeMillis() - viewTime*1000)); //打开时间String ip = CusAccessObjectUtils.getIpAddress(request);ubapEvents.setIp(ip);  // ip地址// ip详细信息IpInfo ipInfo = AddressUtil.getIpInfo(ip);if(ipInfo != null) {ubapEvents.setCountry(ipInfo.getCountry());ubapEvents.setRegion(ipInfo.getRegion());ubapEvents.setCity(ipInfo.getCity());ubapEvents.setIsp(ipInfo.getIsp());}ubapEventsService.insertUbapEvents(ubapEvents);//日志收集response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/gif");try {OutputStream out = response.getOutputStream();BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);ImageIO.write(image, "gif", out);out.flush();}catch (IOException e) {e.printStackTrace();}}

关于UserAgent解析大家可以参考:Java解析User-Agent信息

关于IP解析:
获取IP的方式:

 /*** 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,** 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。** 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,* 192.168.1.100** 用户真实IP为: 192.168.1.110** @param request* @return*/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;}
  • 千万不能用淘宝解析,它做了限制,会经常性的连接超时
  • 我这里采用的是ip138提供的,不过只有前1000是免费的。
    具体代码如下:
public static final String IP_URL = "http://ip.taobao.com/service/getIpInfo.php";/*** txt|jsonp|xml*/public static String DATATYPE="jsonp";public static String get(String urlString,String token) {try {URL url = new URL(urlString);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);conn.setReadTimeout(5 * 1000);conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);conn.setInstanceFollowRedirects(false);conn.setRequestMethod("GET");conn.setRequestProperty("token",token);int responseCode = conn.getResponseCode();if (responseCode == 200) {StringBuilder builder = new StringBuilder();BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));for (String s = br.readLine(); s != null; s = br.readLine()) {builder.append(s);}br.close();return builder.toString();}} catch (IOException e) {e.printStackTrace();}return null;}public static String queryIP(String ip){String url="http://api.ip138.com/query/?ip="+ip+"&datatype="+DATATYPE;String token="46843ed862bac173d000025c11c501b6";return get(url,token);}public static IpInfo getIpInfo(String ip) {IpInfo ipInfo = new IpInfo();String returnStr = queryIP(ip);if (returnStr != null) {JSONObject obj;try {obj = JSON.unmarshal(returnStr, JSONObject.class);String ret = obj.getStr("ret");if ("ok".equals(ret)) {JSONObject.JSONArray dataArray = obj.getArr("data");String[] strArray = dataArray.toString().substring(2, dataArray.toString().length()-1).replaceAll("\"", "").split(",");ipInfo.setCountry(strArray[0]); // 国家ipInfo.setRegion(strArray[1]); // 省ipInfo.setCity(strArray[2]);  // 市ipInfo.setIsp(strArray[3]);   // 运营商}else {ipInfo = null;}}catch (Exception e) {log.error("获取地理位置异常 {}");}}return ipInfo;}

搭建用户行为分析系统(四)——数据建模/存储相关推荐

  1. 基于hadoop的小红书电商网站用户行为分析系统毕业论文+任务书+开题报告+答辩PPT+知网查重报告+项目源码及Mysql数据

    基于hadoop的小红书电商网站用户行为分析系统毕业论文+任务书+开题报告+答辩PPT+知网查重报告+项目源码及Mysql数据库-99源码网,程序代做,代写程序代码,代写编程,代写Java编程,代写p ...

  2. 大数据实战:用户流量分析系统

    ---------------------------------------------------------------------------------------------------- ...

  3. 企业级360°全方位用户画像:标签系统[四]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  4. 如何构建用户行为分析系统?

    2016年12月6号我参加了研究生论文的开题报告,研究方向为基于用户行为的协同过滤推荐算法,因此一直在跟进用户行为相关资料的学习. 经朋友推荐,在极客学院上找到所需资料,我整理后分享给大家,希望大家拍 ...

  5. 基于Spark的用户行为分析系统

    基于Spark的用户行为分析系统源码下载 一.项目介绍   本项目主要用于互联网电商企业中使用Spark技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.购物行为.广告点击行为等)进行 ...

  6. 用户行为服务系统架构调研----电信用户行为分析系统架构

    2基于云计算的系统总体设计方案 2.1系统总体技术架构 本文设计的移动互联网用户行为分析引擎通过云计算技术实现分布式并发的大规模计算能力,构建移动互联网端到端的大数据挖掘分析系统,实现对DPI和应用平 ...

  7. 搭建AWStats日志分析系统

    文章目录 搭建AWStats日志分析系统 实验步骤: 修改DNS主配置文件 修改http服务主配置文件 安装AWStats 修改http服务配置文件 搭建AWStats日志分析系统 AWStats是一 ...

  8. 产品经理必读:用户场景分析的四要素

    导读:用户场景是指用户在不同时间.地点.环境下引发的不同心境.行为或需求,其实就是指用户在某个环境中会触发并完成某个任务. 作者:朱军华 来源:大数据DT(ID:hzdashuju) 假如让你列举一下 ...

  9. 【毕业设计_课程设计】基于Django和vue的微博用户情感分析系统

    文章目录 0 项目说明 1 系统介绍 2 系统功能介绍 3 系统启动注意事项 4 项目工程 0 项目说明 基于Django和vue的微博用户情感分析系统 提示:适合用于课程设计或毕业设计,工作量达标, ...

最新文章

  1. android 6.0 自定义application,Android6.0之App中的资源管理对象创建
  2. 利用PermutationImportance挑选变量
  3. 20162313苑洪铭 第二周作业
  4. java 计算两个日期之间的天数_Java日期时间API系列22-----Jdk8Month月份和DayOfWeek星期的计算。...
  5. /bin/sh -c的必要性
  6. 我们用力的活着却把自己丢了
  7. resnet系列+mobilenet v2+pytorch代码实现
  8. mimakatz用法_两步完成利用procdump64+mimikatz获取win用户密码
  9. SVD在推荐系统中的应用
  10. python免费教程视频-Python免费视频教程
  11. Vue Cli 3代理配置
  12. 台达变频器485通讯接线图_台达PLC与变频器用485通讯怎样实现启动、停止和频率给定,程序怎样做。谢谢!...
  13. cad手机看图 android,CAD手机看图
  14. python处理时间序列非平稳_推荐 :手把手教你用Python处理非平稳时间序列(附代码)...
  15. 微信计数器微信加粉计数器开发
  16. android dialog遮挡键盘,彻底解决软键盘遮挡DialogFragment
  17. 九、系统的软中断导致CPU使用率升高,我该怎么办?
  18. 服务器电池维修,服务器电池电量低判断方法
  19. 13.1 数状数组 ——【小朋友排队】
  20. 广告营销核心干货——《我的营销心得》读书笔记2900字

热门文章

  1. 建设工程保修期出现问题,维修费所承担
  2. qtwebapp库的编译及简单使用
  3. 在CMD命令行下对ntfs分区文件夹权限的设置
  4. 【CMD】删除文件或文件夹
  5. 2018年春节长假旅游市场预测大数据报告
  6. hbuilder php语法验证,HBuilderX语法校验、eslint实时校验自动修复功能配置
  7. 网站收录工具(php导航自动收录源码)_推荐8个良心网站,内含5000+实用工具!还不赶紧收藏...
  8. Linux中的python、mysql安装以及用户与权限
  9. Spring+SpringMVC+Hibernate整合操作数据库 概述
  10. 计算机实战项目之 [含课设报告+源码等]S2SH校园BBS论坛系统[包运行成功]