最近公司需要用到一个统计工具来存储来访者的IP,ADDRESS,SOURCE,KEYWORD,POSITION,SYSTEM,VISITER等信息。
至于怎么获取IP等这些信息网上有一大把资料可以查询,在这里就简单的介绍一下。
(1)IP获取方式:
前台获取可以通过淘宝,新浪等等的免费接口来获取,由于获取还需要用到别人家的接口,这样的话,如果访问量大了,
我们的页面和服务器会承受不起,会出现很多问题,这样的话,还不如用百度商桥,访客通或者51la等统计工具了所以我们
必须要自己获取IP。这是有关前台获取IP的链接:https://pan.baidu.com/s/1bqnDr9H 密码:i595 不建议用此方式获取。
JAVA后台获取IP,我们需要用到servlet里边的HttpServletRequest里边的getRemoteAddr()方法,局域网测试出能
获取到客户端局域网的IP,放到服务器里面就不能获取到客户端公网的IP,获取的都是同一个IP端这下子就头疼了,为什么
呢!原因很简单,那是我们在服务器里边获取的IP是代理商的IP,因为客户访问页面都是通过代理商解析域名和端口,然后
再找到您的服务器的,我们还是可以解决的,因为用户访问的时候也遗留下来了X-Forwarded-For(XFF)用来识别通过HTTP
代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。在这里就提供以下方法。
- //获取客户端IP
- public String getIpAddr(HttpServletRequest request){
- String ipAddress = request.getHeader("x-forwarded-for");
- if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
- ipAddress = request.getHeader("Proxy-Client-IP");
- }
- if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
- ipAddress = request.getHeader("WL-Proxy-Client-IP");
- }
- if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
- ipAddress = request.getRemoteAddr();
- if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
- InetAddress inet=null;
- try {
- inet = InetAddress.getLocalHost();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- }
- ipAddress= inet.getHostAddress();
- }
- }
- if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
- if(ipAddress.indexOf(",")>0){
- ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
- }
- }
- return ipAddress;
- }
(2)KEYWORD可以通过SOURCE来解析,SYSTEM,SCREE_SIZE,SCREE_COLOR等可以通过前台JS获取。
在这里就不一一就述了,如需要。下边有源代码分享。
(3)在做好SSM的环境框架搭建后,CONTROLLER层,SERVICE层,MAPPER层,涉及有关并发的问题。
在这里的话我们可以STATIC全局静态变量userCunt来存储一个控制访问次数。(当然,JAVA开发是尽量不要出现全局
静态变量的,如果出现了说明可能您的程序设计有一些问题的,因为是我这边公司的网站访问量不是很大,项目
初期数据,一年也就1G左右。)STATIC全局静态变量userList存储来访用户信息。这样我们就可以实现来访人数
10人,我们就可以先把10人储存到userList里边,再批量存储数据,减少访问者对数据库的访问,达到数据库的优
化,于是就有了以下代码。
- import java.net.InetAddress;
- import java.net.UnknownHostException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.soupai.visitant.getdata.entity.User;
- import com.soupai.visitant.getdata.mapper.UserMapper;
- import com.soupai.visitant.getdata.service.IUserService;
- @Service
- public class UserService implements IUserService{
- @Autowired
- private UserMapper userMapper;
- public static int userCunt = 0;//用于控制来访次数
- public static List<User> userList = new ArrayList<>();//存储来访用户信息
- /**
- * 增加用户
- */
- public boolean addUser(User user) {
- //标示flag false:存入全局静态变量userList true:存数据库。
- boolean flag = false;
- userCunt++;
- System.out.println("userCunt:"+userCunt);
- if(userCunt<=2){//设计用户如果小于2人就存储在userList里边,等于2人就存储数据
- userList.add(user);
- System.out.println("userList:"+userList.size());
- }else{//大于2人
- userList.add(user);
- userCunt=1;
- }
- if(userList.size()==2){//等于2人,存储数据
- for(int i =0;i< userList.size();i++){//剔除曾经访问过的IP
- System.out.println(userList.size());
- if(queryUserIp(userList.get(i).getIp()) == null){//如果所有已经存到userList的用户都曾经访问过,这时数据库会返回一个空指针异常,所以得屏弊它。
- break;
- }
- if(queryUserIp(userList.get(i).getIp()).getIp()!=""||queryUserIp(userList.get(i).getIp()).getIp()!=null){//过滤单个userList的IP。
- userList.remove(i);
- }
- }
- if(userList.size()<=1){//剔除过后,由于userList的会变小。所以把flag = flase。
- System.out.println(userList.size());
- flag = false;
- }else{//否则就存储数据库
- int rows = this.userMapper.addUserBatch(userList);
- if(rows>0){
- for(int i =0;i< userList.size();i++){
- userList.remove(i);
- }
- flag = true;
- }
- }
- }
- return flag;
- }
- /**
- * 查询用户IP
- */
- public User queryUserIp(String ip) {
- User user= userMapper.getIp(ip);
- return user;
- }
- }
具体源代码,请看
如需要可以加我QQ:1654837174。乐意为奉献分享我的小小经验。
转摘请注明来源。