从request请求头获得请求用户的IP与IP验证

本文介绍了一种从HTTP请求中获取客户端真实IP的方法,包括处理多级反向代理的情况,并提供了一个验证IP格式及匹配原始IP范围的实用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	 /** 
	   * 获取用户真实IP地址,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,
	   * 取X-Forwarded-For中第一个非unknown的有效IP字符串。 
	   * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 
	   * 192.168.1.100 
	   * 
	   * 用户真实IP为: 192.168.1.110 
	   * 
	   * @param request 
	   * @return 
	   */
	  public static String getIpAddress(HttpServletRequest request) { 
		  String ip = request.getHeader("X-Forwarded-For");  
	        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	                ip = request.getHeader("Proxy-Client-IP");  
	            }  
	            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	                ip = request.getHeader("WL-Proxy-Client-IP");  
	            }  
	            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	                ip = request.getHeader("HTTP_CLIENT_IP");  
	            }  
	            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	                ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
	            }  
	            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
	                ip = request.getRemoteAddr();  
	            }  
	        } else if (ip.length() > 15) {  
	            String[] ips = ip.split(",");  
	            for (int index = 0; index < ips.length; index++) {  
	                String strIp = (String) ips[index];  
	                if (!("unknown".equalsIgnoreCase(strIp))) {  
	                    ip = strIp;  
	                    break;  
	                }  
	            }  
	        }  
	        return ip; 
	  }


验证IP格式

/**通过originalIP 校验ip是否有效	<br>
	 * 正确originalIP 可能的格式,如:<br>
	 * 10.2.0.1  <br>
	 * 10.2.0.* <br>
	 * 10.2.*.*<br>
	 * 10.*.*.*<br>
	 * *.*.*.*<br>
	 * ip 的格式一定为10.2.0.2
	 *  */
	public static Boolean validIp(String originalIP,String ip){
		if (!StringUtils.hasText(originalIP)) {
			return true;
		}
		originalIP = originalIP.trim();
		if (!StringUtils.hasText(ip)) {
			return false;
		}
		ip = ip.trim();
		
		String ipReg = "^((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])|\\*)\\."
				  + "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)\\."
			      + "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)\\."
			      + "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)$";
		/**校验ip的格式*/
		Pattern pattern = Pattern.compile(ipReg);
		Matcher ipMatcher = pattern.matcher(ip);
		if (!ipMatcher.matches()) {
			return false;
		}
		/**校验originalIP 的格式*/
		Pattern oriPattern = Pattern.compile(ipReg);
		Matcher oriMatcher = oriPattern.matcher(originalIP);
		if (!oriMatcher.matches()) {
			return false;
		}

		/**originalIP与ip 相同*/
		if(originalIP.equals(ip)){
			return true;
		}
		
		/**校验ip是否处在originalIP段内*/
		
		String[] oriIpArr = originalIP.split("\\.");
		String[] ipArr = ip.split("\\.");
		Boolean hasStar=false;
		String star="*";
		for(int i=0;i<oriIpArr.length;i++){
			String oriIp = oriIpArr[i];
			boolean flag = oriIp.equals(star) ;
			if(flag){
				hasStar=flag;
			}
			if(hasStar && !flag){
				return false;
			}
			if(!ipArr[i].equals(oriIp) && !oriIp.equals(star)){
				return false;
			}
		}
		return true;
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值