热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GithubpagesHexo博客访问量统计功能的实现

之前使用Hexo搭建了自己的github.io博客https:littlefogcat.github.io。但是没有访问统计功能,让人头大。于是决定着手整一个。首先需要有一台自己的

之前使用Hexo搭建了自己的github.io博客https://littlefogcat.github.io/。但是没有访问统计功能,让人头大。于是决定着手整一个。

首先需要有一台自己的服务器,如果没有,或者图方便的话,就用busuanzi.js吧。不过对我个人而言,我更喜欢数据在自己手里,而且如果开发其他新功能也会方便许多。同时,也可以顺便学习一下技术。

由于我对前后端开发几乎都是一窍不通,所以耗费了很多精力,不过最后还是稍有所得,在此记录。


1. 要点


1.1 跨域(同源策略)

由于浏览器的安全策略,js只可以访问相同协议、相同域名、相同端口(同源)下的资源。这就带来一个问题,博客中的js文件无法调用服务器端的接口。


1.2 jsonp

为了解决非同源跨域问题,这里采用了jsonp的解决方案。由于jsonp只支持get方式,所以参数都写在url中。

js端:

var currentPageUrl = window.location.href; // 当前页面地址// 处理服务端返回的数据
function handleCallback(jsonData) {// 将获取到的访问量写入html中
}// 参数
var arrivalServer = "https://myApi?callback=handleCallback&url=" + currentPageUrl;

其中myApi是服务端暴露的获取访问量的接口,而当前页面的url作为唯一标识符做参数传递。(这里是有问题的,最好还是不要把url写在参数里,可以考虑base64编码)callback=handleCallback表示当服务端返回数据时,调用js里的handleCallback函数。

服务端

仅就Java而言,使用com.fasterxml.jackson.databind.util.JSONPObject这个类可以快速创建一个jsonp对象。
示例:

// Code in Controller@ResponseBody@RequestMapping("/arrival")public Object getGithubIoArrival(@RequestParam String callback,@RequestParam String articleUrl,@RequestParam(required = false) String ip) {GithubIoArrivalResult result = service.getArrival(articleUrl, ip);return new JSONPObject(callback, result);}

1.3 https

由于Github Pages强制使用https访问,所以服务端也应该支持https。这篇文章有详细的步骤:5分钟内搞定 Tomcat 的 SSL 配置
如果不想整个应用都是用https,只用将url-pattern标签的内容改成所需要的即可。
如:/githubio/*


2. 服务端

首先明确需求,很简单:



  • 每个页面单独统计访问量

  • 单个ip每日最多计算一次访问量

  • 所有单次访问都有记录

这样需要两张表,一张保存每个页面的访问量(pv),一张保存详细的访问记录(record)。

逻辑很简单。当一个Get请求到达时,首先将其保存至record表中,然后再查找当天是否已经浏览过本页面。只有当这个ip当日没有浏览过本页面时,才更新pv表,本页面的浏览量+1。最后返回页面浏览数。


3. 前端(Hexo)

找到hexo博客的根目录, 修改themes\landscape\layout\_partial\head.ejs文件。
在其中添加一行

<script src="http://pv.sohu.com/cityjson?ie=utf-8" type="text/Javascript"></script>

这个搜狐的链接,用于获取当前用户的IP地址。

然后,修改themes\landscape\layout\_partial\footer.ejs文件。添加以下内容

<script type="text/Javascript">var href = window.location.href; // 当前页面地址function handleCallback(jsonData) {console.log("jsOnData= " + jsonData);var arrival = jsonData.arrival;document.getElementById("page_view").innerHTML = arrival;}var src = "https://106.14.152.93:8443/third/githubio/arrival?callback=handleCallback&articleUrl="+ href + "&ip=" + returnCitySN["cip"];document.write(" + src + "\"><\/script>");</script>

至此,访问统计功能就完成了。
sample

示例
LittleFogCat’s Page - https://littlefogcat.github.io/


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • MySQL binlog与增量备份的基本原理总结
    定义binlog是记录所有数据库表结构变更(例如CREATE、ALTERTABLE…)以及表数据修改(INSERT、UPDATE即使up ... [详细]
  • 技术分享:如何在没有公钥的情况下实现JWT密钥滥用
      ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
28划生12_928
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有