这里先介绍几个概念
IP: 指独立IP数。00:00-24:00内相同IP地址之被计算一次。
PV:即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
UV: 即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
统计功能可以借助一些其他工具进行统计。具体哪些工具就不细说了,可以通过类似在页面上加<script>等统计,我们这里是自己实现用户访问的统计。
我们在采用过滤器中进行页面的统计。
//过滤器
@Component
public class SimpleCORSFilter implements Filter {
@Autowired
private IPCountService ipCountService;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//过滤器层面进行统计访问量
ipCountService.addIPCountOther(req);
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {
}
public void destroy() {
}
}
//service方法
@Override
public void addIPCountOther(ServletRequest req) {
String requestURL = ((RequestFacade) req).getRequestURI();
if (requestURL.endsWith(".css") || requestURL.endsWith(".js") || requestURL.endsWith(".png") || requestURL.endsWith(".woff2") || requestURL.endsWith(".ico") || requestURL.endsWith(".woff") ||
requestURL.endsWith(".gif") || requestURL.endsWith(".css") || requestURL.endsWith(".jpg") || requestURL.endsWith("/404")) {
return;
}
IPCount ipCount = new IPCount();
ipCount.setUrl(requestURL);
ipCount.setAccessTime(new Date());
String realIP =IPUtils.getRemoteIp((HttpServletRequest) req);
ipCount.setIPAddress(realIP);
ipCount.setFilterType(2);
ipCountDao.addIPCount(ipCount);
}
/**
* 获取IP地址
*
* @param request HttpServletRequest
* @return IP地址
*/
public static String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.info("[IPUtils getRemoteIp] Proxy-Client-IP:" + ip);
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.info("[IPUtils getRemoteIp] WL-Proxy-Client-IP:" + ip);
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.info("[IPUtils getRemoteIp] getRemoteAddr:" + ip);
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
logger.info("[IPUtils getRemoteIp] X-Real-IP:" + ip);
}
return ip;
}
在Nginx.conf 这个配置文件中加入
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
这样,我们可以通过 X-Real-IP 这个消息头获取到真实路径。因为我们通过Nginx做服务器,所有Nginx访问tomcat的时候,获取的IP时为127.0.0.1;
下面是截取了数据库中的一部分登录IP数据,我们就可以根据数据来统计每日的IP和PV了。而且也可以看到一些不友善的访问,比如下面的wp-login.php这种。后面我们就可以根据访问情况进行网站的维护和优化。
欢迎转载,转载请注明出处 http://www.dingyinwu.com/article/66.html
如果文章中有任何问题或者可以改进的地方,请大家多提提意见,我会非常感激。