Java 如何获取客户端IP呢?
核心思想:通过HTTP的request来获取
下面是我总结的几种方法:
- /**
- * 获取客户端ip地址(可以穿透代理)
- *
- * @param request
- * @return
- */
- public static String getRemoteAddr(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;
- }
- private static final String[] HEADERS_TO_TRY = {
- "X-Forwarded-For",
- "Proxy-Client-IP",
- "WL-Proxy-Client-IP",
- "HTTP_X_FORWARDED_FOR",
- "HTTP_X_FORWARDED",
- "HTTP_X_CLUSTER_CLIENT_IP",
- "HTTP_CLIENT_IP",
- "HTTP_FORWARDED_FOR",
- "HTTP_FORWARDED",
- "HTTP_VIA",
- "REMOTE_ADDR",
- "X-Real-IP"};
- /***
- * 获取客户端ip地址(可以穿透代理)
- * @param request
- * @return
- */
- public static String getClientIpAddress(HttpServletRequest request) {
- for (String header : HEADERS_TO_TRY) {
- String ip = request.getHeader(header);
- if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
- return ip;
- }
- }
- return request.getRemoteAddr();
- }
- /***
- * 获取客户端ip地址(可以穿透代理)
- * @param request
- * @return
- */
- public static String getClientIpAddr(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_X_FORWARDED_FOR");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_X_FORWARDED");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_X_CLUSTER_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_FORWARDED_FOR");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_FORWARDED");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_VIA");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("REMOTE_ADDR");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getRemoteAddr();
- }
- return ip;
- }
- public static String getIpAddr(HttpServletRequest request) {
- String ip = request.getHeader("X-Real-IP");
- if (null != ip && !"".equals(ip.trim())
- && !"unknown".equalsIgnoreCase(ip)) {
- return ip;
- }
- ip = request.getHeader("X-Forwarded-For");
- if (null != ip && !"".equals(ip.trim())
- && !"unknown".equalsIgnoreCase(ip)) {
- // get first ip from proxy ip
- int index = ip.indexOf(',');
- if (index != -1) {
- return ip.substring(0, index);
- } else {
- return ip;
- }
- }
- return request.getRemoteAddr();
- }
我使用的是spring MVC框架,测试的控制器代码如下:
- package com.web.controller;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.common.util.SystemHWUtil;
- import com.common.util.WebServletUtil;
- import com.string.widget.util.ValueWidget;
- import com.util.JSONPUtil;
- /***
- * 用于测试跨域
- * @author huangweii
- * 2015年5月29日
- */
- @Controller
- @RequestMapping("/cors")
- public class CORSController {
- @ResponseBody
- @RequestMapping(value = "/simple",produces=SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
- public String corsJsonSimple(HttpServletRequest request,String callback){
- String content;
- Map map=new HashMap();
- map.put("username", "黄威");
- map.put("age", "27");
- map.put("address", "beijing");
- content=JSONPUtil.getJsonP(map, callback);
- System.out.println("getIpAddr:"+WebServletUtil.getIpAddr(request));
- System.out.println("getRemoteAddr:"+WebServletUtil.getRemoteAddr(request));
- System.out.println("getClientIpAddr:"+WebServletUtil.getClientIpAddr(request));
- System.out.println("getClientIpAddress:"+WebServletUtil.getClientIpAddress(request));
- return content;
- }
- }
测试结果:
参考:Java获取用户ip
http://blog.csdn.net/hw1287789687/article/details/46292069