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属性中.

最新文章

  1. python核心编程学习记录之映射和集合类型
  2. [Spring] - 读写分离
  3. Android IOS WebRTC 音视频开发总结(四八)-- 从商业和技术的角度看视频行业的机会
  4. Oracle 10g 默认安装带来的用户名/密码
  5. C# ToString常用技巧总结
  6. [ES6] for..in && for..of
  7. iOS 四种延时的方法
  8. 一份关于jvm内存调优及原理的学习笔记
  9. 重复T次的LIS的dp Codeforces Round #323 (Div. 2) D
  10. Sanatorium
  11. 篇4 安卓app自动化测试-Appium API进阶
  12. spring core 与 context理解
  13. 恶补web之八:jQuery(1)
  14. vue脚手架工具
  15. vue的事件处理梳理
  16. Java:ConcurrentLinkedQueue的实现原理分析
  17. 【BZOJ4832】抵制克苏恩(矩阵快速幂,动态规划)
  18. jQuery对url的操作
  19. Win8.1 查看 “Windows 体验指数“
  20. git 彻底删除历史记录中的大文件

热门文章

  1. Swagger2多包扫描
  2. 不用Blazor WebAssembly,开发在浏览器端编译和运行C#代码的网站
  3. dev C++ 调试卡住/遇到endl函数卡住
  4. 微信小程序分类菜单激活状态跟随列表滚动自动切换
  5. vscode+eslint项目规范化,自动格式化配置(项目中用到的)
  6. python (),[], {}的含义
  7. window C盘满了/文件夹太长怎么移动
  8. C语言学习--指针大小端
  9. Ubuntu 安装 PHP
  10. Vue项目安装less和less-loader