Java-获取真实用户ip

 1 import common.util.StringUtil;
 2 import org.springframework.web.bind.annotation.ModelAttribute;
 3 
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 import javax.servlet.http.HttpSession;
 7 
 8 public class BaseController {
 9     protected HttpServletRequest request;
10     protected HttpServletResponse response;
11     protected HttpSession session;
12 
13     @ModelAttribute
14     public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
15         this.request = request;
16         this.response = response;
17         this.session = request.getSession();
18     }
19     /**
20      * 使用nginx反向代理后获取请求端真实IP
21      * @return
22      */
23     public String getClientIP() {
24         String ip = request.getHeader("X-Forwarded-For");
25         if(!StringUtil.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)){
26             //优先考虑多重代理的情况,应该取第0位的ip值
27             System.out.println("ip=>"+ip);
28             ip = ip.split(", ")[0];
29             System.out.println("ip==>"+ip);
30 
31         }
32         if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
33             //目前没有遇到多重代理,一般在X-Real-IP中就能获得
34             ip = request.getHeader("X-Real-IP");
35             System.out.println("ip===>"+ip);
36         }
37         if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
38             ip = request.getRemoteAddr();
39             System.out.println("ip====>"+ip);
40         }
41         return ip;
42     }
43 }

 需要的业务代码继承此类,再在适当处调用其中方法即可;

PS:

  1.客户端A调用服务B,服务B调用服务C,若在服务C中以此方法获取真实ip,只能获取服务B的ip,并无法获取客户端A的ip;

  2.若想服务C中想获取客户端A的真实ip,则需服务B将客户端A的ip在请求服务C的接口中将客户端A的真实ip填入request

   的X-Forwarded-For属性中.

posted @ 2022-08-15 15:59  静沐丶暖阳  阅读(952)  评论(0编辑  收藏  举报