自己搭建了一个基于SpringBoot+Spring Security+MyBatis+MySQL+Redis+Thymeleaf的博客网站
上线个人云服务器后,发现服务器访问慢。个人服务器是1核2G的,1M宽带,虽然服务器是低配的,但是可以通过优化代码,中间件等手段,来提升性能。

这篇主要讲网站增加访客记录的功能

1、设计表字段,新增visit表

id主键,city城市,url访问博客的url,visTime访问时间,browserType浏览器类型(360浏览器,谷歌浏览器,百度浏览器,IE浏览器),platformType平台类型(安卓,苹果,电脑)

2、建表语句

CREATE TABLE `visit` (`id` int(11) NOT NULL AUTO_INCREMENT,`ip` varchar(255) DEFAULT NULL,`city` varchar(255) DEFAULT NULL,`url` varchar(255) DEFAULT NULL,`visitTime` varchar(255) DEFAULT NULL,`browserType` varchar(255) DEFAULT NULL,`platformType` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16081 DEFAULT CHARSET=utf8;

3、实体类

@Data
public class Visit {private Integer id;private String ip;private String city;private String url;private String visitTime;private String browserType;//浏览器类型private String platformType;//平台类型public Visit(){}public Visit(String browserType, String platformType){this.browserType = browserType;this.platformType = platformType;}}

4、写个根据IP地址获取详细的地域信息的工具类

http://ip.taobao.com/service/getIpInfo.php 这个调用淘宝的访问ip具体信息的工具类,调完这个接口,对结果进行封装,地区划分国家,省份,城市(其中,对编码unicode设置为中文的)

package com.zxl.utils;import org.apache.commons.lang.StringUtils;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;/*** 根据IP地址获取详细的地域信息*/
public class AddressUtil {public String getAddresses(String content, String encodingString)throws UnsupportedEncodingException {String urlStr = "http://ip.taobao.com/service/getIpInfo.php";String returnStr = this.getResult(urlStr, content, encodingString);if (returnStr != null) {// 处理返回的省市区信息//System.out.println(returnStr);String[] temp = returnStr.split(",");if (temp.length <= 3) {return "未知城市";  // 无效IP,局域网测试}String country = (temp[2].split(":"))[1].replaceAll("\"", "");country = decodeUnicode(country);// 国家if (country.equals("XX") || country == "") {country = "";}String province = (temp[4].split(":"))[1].replaceAll("\"", "");province = decodeUnicode(province);// 省份if (province.equals("XX") || province == "") {province = "";} else {province = province + "省";}String area = (temp[3].split(":"))[1].replaceAll("\"", "");area = decodeUnicode(area);// 地区if (area.equals("XX") || StringUtils.isEmpty(area)) {area = "";} else {area = area + "区/县";}String city = (temp[5].split(":"))[1].replaceAll("\"", "");city = decodeUnicode(city);// 城市if (city.equals("XX") || city == "" || city.equals("内网IP")) {city = "";} else {city = city + "市";}String isp = (temp[7].split(":"))[1].replaceAll("\"", "");isp = decodeUnicode(isp);// ISPif (isp.equals("XX") || isp == "") {isp = "";}String str = province + city + isp;if (str.equals("") || str == "") {str = country;} else {str = province + city + area + " " + isp;}return str;}return "未知城市";}private String getResult(String urlStr, String content, String encoding) {URL url = null;HttpURLConnection connection = null;try {url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();// 新建连接实例connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒connection.setDoOutput(true);// 是否打开输出流 true|falseconnection.setDoInput(true);// 是否打开输入流true|falseconnection.setRequestMethod("POST");// 提交方法POST|GETconnection.setUseCaches(false);// 是否缓存true|falseconnection.connect();// 打开连接端口DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxxout.flush();// 刷新out.close();// 关闭输出流BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据// ,以BufferedReader流来读取StringBuffer buffer = new StringBuffer();String line = "";while ((line = reader.readLine()) != null) {buffer.append(line);}reader.close();return buffer.toString();} catch (IOException e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();// 关闭连接}}return "";}/*** unicode 转换成 中文*/public static String decodeUnicode(String theString) {char aChar;int len = theString.length();StringBuffer outBuffer = new StringBuffer(len);for (int x = 0; x < len; ) {aChar = theString.charAt(x++);if (aChar == '\\') {aChar = theString.charAt(x++);if (aChar == 'u') {int value = 0;for (int i = 0; i < 4; i++) {aChar = theString.charAt(x++);switch (aChar) {case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value = (value << 4) + aChar - '0';break;case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value = (value << 4) + 10 + aChar - 'a';break;case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':value = (value << 4) + 10 + aChar - 'A';break;default:throw new IllegalArgumentException("Malformed      encoding.");}}outBuffer.append((char) value);} else {if (aChar == 't') {aChar = '\t';} else if (aChar == 'r') {aChar = '\r';} else if (aChar == 'n') {aChar = '\n';} else if (aChar == 'f') {aChar = '\f';}outBuffer.append(aChar);}} else {outBuffer.append(aChar);}}return outBuffer.toString();}}

5、编写个IP工具类,用来获取IP信息

public class IpUtil {// 获取IPpublic static String getIp(HttpServletRequest httpRequest) {String ipAddress = httpRequest.getHeader("x-forwarded-for");if (ipAddress == null || ipAddress.length() == 0|| "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = httpRequest.getHeader("Proxy-Client-IP");}if (ipAddress == null || ipAddress.length() == 0|| "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = httpRequest.getHeader("WL-Proxy-Client-IP");}if(null == ipAddress || 0 == ipAddress.length() || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = httpRequest.getHeader("X-Real-IP");}if (ipAddress == null || ipAddress.length() == 0|| "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = httpRequest.getRemoteAddr();if (ipAddress.equals("127.0.0.1")|| ipAddress.equals("0:0:0:0:0:0:0:1")) {// 根据网卡取本机配置的IPInetAddress inet = null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}ipAddress = inet.getHostAddress();}}// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()// = 15if (ipAddress.indexOf(",") > 0) {ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));}}return ipAddress;}}

6、新增访客记录方法

接下来就是具体的操作了,每次访问文章的时候,调insert方法,这个insert方法就是把访客的ip,地址,访问的文章等信息插入到visit这个表里

public void insert(HttpServletRequest request){Visit visit = new Visit();visit.setIp(IpUtil.getIp(request));TimeUtil timeUtil = new TimeUtil();visit.setVisitTime(timeUtil.getFormatDateForSix());int visitTimes = visitMapper.findVisitTimes(timeUtil.getFormatDateForThree(), IpUtil.getIp(request));String userAgent = request.getHeader("user-agent");try{if (visitTimes == 0) {visit.setPlatformType(UserAgentUtil.getUserAgent(userAgent).getPlatformType());visit.setBrowserType(UserAgentUtil.getUserAgent(userAgent).getBrowserType());visit.setUrl(request.getRequestURL().toString());visit.setCity(new AddressUtil().getAddresses("ip="+ visit.getIp(), "utf-8"));visitMapper.insert(visit);}}catch (Exception e){e.printStackTrace();}
}

插入成功

总结:

每次访问首页,文章的时候,都可以调用新增访客记录的方法,这个功能就类似于QQ空间的访客记录。现在很多网站都会有访客记录,有些是用户可以看到,有些只有管理员才能看到。

个人网站性能优化经历(10)网站增加访客记录相关推荐

  1. 一次网站性能优化经历

    六月份开始搭建的自己的第一个网站:书虫小说. 在经历前端页面重写后,网站首屏加载速度有了一定提升,之后发现小说目录详情页白屏时间竟然高达1-2s,拖了一段时间,打算解决这个问题,我用Chrome调试抓 ...

  2. 如何进行网站性能优化?

    如何进行网站性能优化? 1.背景介绍 为什么要对网站进行性能优化 网站的访问量及用户的持久性其实在一定程度上取决于其性能,如果一个网站响应耗时久,动画卡顿,占用大量的cpu等,往往就会导致用户流失.尤 ...

  3. 前端-网站性能优化——CDN加速

    前端-网站性能优化--CDN加速 网站性能优化是一个大活儿,按工种划分的话,分前端.后端和db等,作为一名前端工程师,这系列文章只聊前端工程师应该知道的关于网站性能优化的那些事儿.写此文章算是一个工作 ...

  4. 移动网站性能优化:网页加载技术概览

    移动网站性能优化:网页加载技术概览 2013/08/27 | 分类: IT技术 | 0 条评论 | 标签: WEB开发, 性能优化, 移动 分享到: 47 本文由 伯乐在线 - 伯乐在线读者 翻译自  ...

  5. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

  6. 网站性能优化之HTTP请求过程简述!

    网站性能优化中首要的一条就是要减少HTTP请求,那么为要减少HTTP请求呢?其实有些HTTP分析工具可以帮我们了解当浏览器请求一个资源时大致需要经历的哪些过程. 1 域名解析(DNS Lookup): ...

  7. 前端如何进行网站性能优化

    大家好,我是IT修真院学员,一枚正直纯洁善良的WEB程序员,今天给大家分享一下,修真院官网JS任务4,深度思考中的知识点-前端如何进行网站性能优化. 一.背景介绍 性能优化的目的 1.从用户角度而言, ...

  8. JavaScript系列—性能优化之《网站性能优化实战——从12.67s到1.06s的故事》

    本篇博文来源于网络 226 人赞同了该文章 原文作者:IMWeb jerryOnlyZRJ  原文链接:网站性能优化实战--从12.67s到1.06s的故事 - 腾讯Web前端 IMWeb 团队社区 ...

  9. 【前端性能】网站性能优化

    网站性能优化 1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数, ...

最新文章

  1. 极客新闻——12、错误和失败的区别是什么?
  2. linux redis经常自动关闭,Linux开启关闭redis
  3. iometer-2006_07_27.common-src编译
  4. 旗舰杀手!红米旗舰定名 干翻全场?
  5. 更快更强,来试试 Mybatis 的增强版——EasyMybatis
  6. 苹果又发布一个机器学习框架,帮自家生态里的开发者降低AI门槛
  7. python代码示例-《Python编程:从入门到实践》DEMO实例代码
  8. Sangfor AIOps in VDI:快看深信服IOM如何快速解决70%以上的桌面云运维管理问题
  9. 百度地图只显示行政区划轮廓
  10. 《人月神话》:人月神话
  11. 绕过IceSword文件检测的Trojan.Win32.Mnless.zpc/ojj6erv.sys
  12. iOS7 与 iOS8上 uisegementcontrol 设置image不显示问题
  13. python panel dataframe_Pandas面板(Panel)
  14. 短除法求解最大公约数c语言,[编程入门]最大公约数与最小公倍数-题解(C语言代码)(短除法)...
  15. 哲理小故事--跳蚤人生
  16. 将Android布局转成图片,并保存到本地(解决JPEG图片因透明度变黑问题)
  17. 斐波拉契数列 Java三种实现
  18. 牛客--剑指offer,JZ3,JZ4,JZ5,JZ6
  19. 炒股程序化交易接口怎么获取实时行情
  20. java 图片合成_java 将两张相片合成一张,开发实用类

热门文章

  1. IT界的兄弟姐妹们,大家好。
  2. Google可能在春节后回归中国市场。
  3. 老祖宗老话大全,值得收藏!
  4. 宝贝狗~~~~~~青龙脚本
  5. java.vm.info_JNI完全指南(十)——JavaVM与JNIEnv
  6. 入职第一个CRUD项目小结
  7. 快速高效的阅读一篇AI论文方法
  8. JVM问题分析调优经验
  9. 首师大附中互测题:50229234海岛帝国:独立之战【C002】
  10. win7的svchost.exe占用内存过高如何解决