如何根据HttpServletRequest判断请求方是内网还是外网
这里直接上代码:
package com.fusion; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import sun.net.util.IPAddressUtil; import javax.servlet.http.HttpServletRequest; @SpringBootApplication @RestController public class StartApplication { public static void main(String[] args) { SpringApplication.run(StartApplication.class, args); } @GetMapping("/hello") public String hello(HttpServletRequest request) { String ip=getIpAddress(request); boolean isinter=internalIp(ip); return String.format("Hello,the request ip is %s,the netType is %s", ip,isinter?"内网":"外网"); } public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); 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(); } return ip; } public boolean internalIp(String ip) { if("127.0.0.1".equals(ip)){ return true; } byte[] addr = IPAddressUtil.textToNumericFormatV4(ip); return internalIp(addr); } public boolean internalIp(byte[] addr) { final byte b0 = addr[0]; final byte b1 = addr[1]; //10.x.x.x/8 final byte SECTION_1 = 0x0A; //172.16.x.x/12 final byte SECTION_2 = (byte) 0xAC; final byte SECTION_3 = (byte) 0x10; final byte SECTION_4 = (byte) 0x1F; //192.168.x.x/16 final byte SECTION_5 = (byte) 0xC0; final byte SECTION_6 = (byte) 0xA8; switch (b0) { case SECTION_1: return true; case SECTION_2: if (b1 >= SECTION_3 && b1 <= SECTION_4) { return true; } case SECTION_5: switch (b1) { case SECTION_6: return true; } default: return false; } } }