JAVA SSM项目解决有关并发的问题。

 最近公司需要用到一个统计工具来存储来访者的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请求头字段。在这里就提供以下方法。

  1. //获取客户端IP
  2. public String getIpAddr(HttpServletRequest request){  
  3.    String ipAddress = request.getHeader("x-forwarded-for");  
  4.        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
  5.            ipAddress = request.getHeader("Proxy-Client-IP");  
  6.        }  
  7.        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
  8.            ipAddress = request.getHeader("WL-Proxy-Client-IP");  
  9.        }  
  10.        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {  
  11.            ipAddress = request.getRemoteAddr();  
  12.            if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){  
  13.                InetAddress inet=null;  
  14.                try {  
  15.                    inet = InetAddress.getLocalHost();  
  16.                } catch (UnknownHostException e) {  
  17.                    e.printStackTrace();  
  18.                }  
  19.                ipAddress= inet.getHostAddress();  
  20.            }  
  21.        }  
  22.        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15  
  23.            if(ipAddress.indexOf(",")>0){  
  24.                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));  
  25.            }
  26.        }  
  27.        return ipAddress;   
  28. }

(2)KEYWORD可以通过SOURCE来解析,SYSTEM,SCREE_SIZE,SCREE_COLOR等可以通过前台JS获取。

在这里就不一一就述了,如需要。下边有源代码分享。

(3)在做好SSM的环境框架搭建后,CONTROLLER层,SERVICE层,MAPPER层,涉及有关并发的问题。

在这里的话我们可以STATIC全局静态变量userCunt来存储一个控制访问次数。(当然,JAVA开发是尽量不要出现全局

静态变量的,如果出现了说明可能您的程序设计有一些问题的,因为是我这边公司的网站访问量不是很大,项目

初期数据,一年也就1G左右。)STATIC全局静态变量userList存储来访用户信息。这样我们就可以实现来访人数

10人,我们就可以先把10人储存到userList里边,再批量存储数据,减少访问者对数据库的访问,达到数据库的优

化,于是就有了以下代码。

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import com.soupai.visitant.getdata.entity.User;
  9. import com.soupai.visitant.getdata.mapper.UserMapper;
  10. import com.soupai.visitant.getdata.service.IUserService;
  11. @Service
  12. public class UserService implements IUserService{
  13. @Autowired
  14. private UserMapper userMapper;
  15. public static int userCunt = 0;//用于控制来访次数
  16. public static List<User> userList = new ArrayList<>();//存储来访用户信息
  17. /**
  18. * 增加用户
  19. */
  20. public boolean addUser(User user) {
  21. //标示flag false:存入全局静态变量userList true:存数据库。
  22. boolean flag = false;
  23. userCunt++;
  24. System.out.println("userCunt:"+userCunt);
  25. if(userCunt<=2){//设计用户如果小于2人就存储在userList里边,等于2人就存储数据
  26. userList.add(user);
  27. System.out.println("userList:"+userList.size());
  28. }else{//大于2人
  29. userList.add(user);
  30. userCunt=1;
  31. }
  32. if(userList.size()==2){//等于2人,存储数据
  33. for(int i =0;i< userList.size();i++){//剔除曾经访问过的IP
  34. System.out.println(userList.size());
  35. if(queryUserIp(userList.get(i).getIp()) == null){//如果所有已经存到userList的用户都曾经访问过,这时数据库会返回一个空指针异常,所以得屏弊它。
  36. break;
  37. }
  38. if(queryUserIp(userList.get(i).getIp()).getIp()!=""||queryUserIp(userList.get(i).getIp()).getIp()!=null){//过滤单个userList的IP。
  39. userList.remove(i);
  40. }
  41. }
  42. if(userList.size()<=1){//剔除过后,由于userList的会变小。所以把flag = flase。
  43. System.out.println(userList.size());
  44. flag = false;
  45. }else{//否则就存储数据库
  46. int rows = this.userMapper.addUserBatch(userList);
  47. if(rows>0){
  48. for(int i =0;i< userList.size();i++){
  49. userList.remove(i);
  50. }
  51. flag = true;
  52. }
  53. }
  54. }
  55. return flag;
  56. }
  57. /**
  58. * 查询用户IP
  59. */
  60. public User queryUserIp(String ip) {
  61. User user= userMapper.getIp(ip);
  62. return user;
  63. }
  64. }

具体源代码,请看

如需要可以加我QQ:1654837174。乐意为奉献分享我的小小经验。

转摘请注明来源。








  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值