目录

1:HttpServletRequest类的常用方法

1.1:HttpServletRequest类有什么用

1.2:HttpServletRequest常用方法

1.3:示例:

2:客户端访问jsp,jsp获取客户端ip

3:客户端访问jsp,jsp请求接口,这个时候接口获取到的就是服务器ip

4:request.getRemoteAddr()获取客户端地址的坑(经过反向代理等转发)

4.1:原因

4.2:解决方法

4.3:提供获取客户端ip地址的工具类


1:HttpServletRequest类的常用方法

1.1:HttpServletRequest类有什么用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

1.2:HttpServletRequest常用方法

  • getRequestURI() 获取请求的资源路径
  • getScheme() 返回用以作出请求消息的方案的名称,如 http, https, 或ftp等

  • getServerPort() 返回收到请求的端口号

  • getServerName() 返回收到请求的服务器主机的名字

  • getRemoteHost() 获得客户端的主机名
  • getRemoteAddr()  获得客户端的ip地址
  • getHeader() 获取请求头
  • getParameter() 获取请求的参数
  • getParameterValues() 获取请求的参数(多个值的时候使用)
  • getMethod() 获取请求的方式 GET 或 POST
  • setAttribute(key, value); 设置域数据
  • getAttribute(key); 获取域数据
  • getRequestDispatcher() 获取请求转发对象

1.3:示例:

服务器地址:172.20.10.2,客户端地址:172.20.10.4

 String requestURI = request.getRequestURI();//   /SSO/lDAPLogin.jspnew BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  requestURI---"+requestURI);String Scheme = request.getScheme();//httpnew BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  Scheme---"+Scheme);String contextPath = request.getContextPath();new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  contextPath---"+contextPath);int serverPort = request.getServerPort();//8080new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  serverPort---"+serverPort);String serverName = request.getServerName();//172.20.10.2new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  serverName---"+serverName);String servletPath = request.getServletPath();///SSO/lDAPLogin.jspnew BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  servletPath---"+servletPath);String pathInfo = request.getPathInfo();new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  pathInfo---"+pathInfo);String remoteHost = request.getRemoteHost();//172.20.10.4new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  remoteHost---"+remoteHost);String remoteAddr = request.getRemoteAddr();//172.20.10.4new BaseBean().writeLog(this.getClass().getName()+"------JspClass : jsp_service_method  remoteAddr---"+remoteAddr);

2:客户端访问jsp,jsp获取客户端ip

服务器地址:172.20.10.2,客户端地址:172.20.10.4,request.getRemoteAddr()获取到地址是172.20.10.4

注:针对前后端分离的项目, request.getRemoteAddr();获取的是客户的真实IP,而非前端IP。因为用户请求前端服务器,前端将HTML和JS代码渲染到本地,本地再去调用服务端。

3:客户端访问jsp,jsp请求接口,这个时候接口获取到的就是服务器ip

服务器地址:172.20.10.2,客户端地址:172.20.10.4,接口中request.getRemoteAddr()获取到地址是172.20.10.2

如果想要

4:request.getRemoteAddr()获取客户端地址的坑(经过反向代理等转发)

4.1:原因

客户端的请求经过服务器Nginx反向代理后,RemoteAddr地址为Nginx的地址。

Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实的IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时域名、协议、端口,而非客户端浏览器地址栏上的真实域名、协议、端口。

这是因为Nginx的反向代理实际上是客户端和真实应用服务器之间的一个桥梁,客户端(一般是浏览器)访问Nginx服务器,Nginx再去访问Web服务器。对于Web应用来说,这次HTTP请求的客户端是Nginx而非真实的客户端浏览器,如果不加特殊处理的话,Web应用会把Nginx当做请求的客户端,获取到的客户端信息就是Nginx的信息。

4.2:解决方法

在配置Nginx反向代理的时候,添加一些请求Header

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
  • Host:包含客户端真实的域名和端口号。
  • X-Forwarded-Proto:表示客户端真实的协议(http还是https)。
  • X-Real-IP:表示客户端真实的IP
  • X-Forwarded-For:这个Header和X-Real-IP类似,但是它在多层代理时会包含真实客户端及中间每个代理服务器的IP。

4.3:提供获取客户端ip地址的工具类

/*** 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。* 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了* 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。* 但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址* 如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,* 取X-Forwarded-For中第一个非unknown的有效IP字符串。** */
public static String getIpAddr(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.getRemoteAddr();}if ((ip.indexOf(",") >= 0)){ip = ip.substring(0 , ip.indexOf(","));}return ip;}

注:如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实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

5:java中获取当前服务器的Ip地址

public static void main(String[] args) {try {InetAddress address = InetAddress.getLocalHost();//获取的是本地的IP地址 //PC-20140317PXKX/192.168.0.121String hostAddress = address.getHostAddress());//192.168.0.121InetAddress address1 = InetAddress.getByName("www.wodexiangce.cn");//获取的是该网站的ip地址,比如我们所有的请求都通过nginx的,所以这里获取到的其实是nginx服务器的IP地String hostAddress1 = address1.getHostAddress());//124.237.121.122InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");//根据主机名返回其可能的所有InetAddress对象for(InetAddress addr:addresses){System.out.println(addr);//www.baidu.com/14.215.177.38//www.baidu.com/14.215.177.37}} catch (UnknownHostException e) {e.printStackTrace();}}

服务器获取请求ip地址相关推荐

  1. PHP服务器获取客户端IP地址

    不废话,直接上代码: 1.编写函数以供多次调用 <?php    function get_real_ip(){   $ip=false;   if(!empty($_SERVER[" ...

  2. [php] 获取请求 IP 地址,及所处 IP 所在服务商代码

    // 获取 IP 地址 function get_remote_addr() {if (isset($_SERVER["HTTP_X_REAL_IP"])){return $_SE ...

  3. Centos 服务器 获取出口ip地址

    由于和第三方接口调试,第三方添加了白名单,需要获取服务器的出口ip 命令如下 curl ifconfig.io

  4. java获取请求ip的方法

    在上篇文章中我们介绍了 java获取请求 ip的方法,那么这篇文章我们就来详细讲解下获取请求 ip的方法.获取请求 ip的方法是基于 HTTP协议的,其原理如下: 1.用 web应用程序,将 web服 ...

  5. php如何获取客户端请求ip地址的方法

    php如何获取客户端请求ip地址的方法 获取客户端ip地址的函数 获取客户端ip地址的函数 function getip(){$ip = false;if (!empty($_SERVER[" ...

  6. 利用python写一个自动获取局域网ip地址并开启服务器绕过校园网设备限制的小工具

    前言 ​ 这个学年学校把宽带运营商从之前的联通大哥哥换成了如今的电信小弟弟,使用体验可谓一落千丈,最主要的原因是电信不再像联通提供拨号上网的账号和密码,改成了强制使用天翼校园的程序来进行认证上网,而且 ...

  7. 二、获取永久IP地址服务器

    获取永久IP地址服务器 既然上述我们提到了需要获取一个有永久IP地址的端口服务器来进行信息中转才能更好地实现C/S架构,在这里我就用比价常用的腾讯云服务器来实现. 在百度上搜索腾讯云即可找到相应的服务 ...

  8. 前端获取用户ip地址,并放在请求头上(uniapp和H5)

    今日需求: 获取用户ip地址,并在每一次请求的时候带上这个ip地址 1.如何获取用户IP地址: 获取 用户ip地址的方式有很多,各大地图的开发者平台都能找到相关的API接口地址,都很牛掰,但是我看了一 ...

  9. 从HTTP请求中获取客户IP地址

    /*** 从HTTP请求中获取客户IP地址** @param request http请求* @return 客户IP地址*/public static String getIPAddress( Ht ...

  10. PHP获取客户端请求IP地址

    PHP获取客户端IP地址方法总结如下 <?php // +-------------------------------------------------------------------- ...

最新文章

  1. centos 非root用户(普通用户)替换yum安装软件方法
  2. leetcode-11-盛最多水的容器
  3. Eclipse上GIT插件EGIT使用手册之五_查看历史记录
  4. python zipfile setpassword_Python模块:zipfile
  5. 很少人知道,但是非常实用的 Python 库
  6. 十大垃圾食品中八种可致脂肪肝
  7. Java程序员必会的工具库,让你的代码量减少90%!
  8. Maven图文闪电入门
  9. 自制药枕:边做梦边养生
  10. 北大oj百练-1003
  11. (淘宝无限适配)手机端rem布局详解
  12. qgg包-续2-大数据集教程
  13. java 文件夹下的文件_java读取某个文件夹下的所有文件
  14. Ubuntu16.04+ROS kinetic +Basler_camera环境配置以及相机标定
  15. egg-sequelize使用教程
  16. 安装taro踩到小坑
  17. 我的世界服务器显示离线,我的世界离线模式怎么玩服务器 | 手游网游页游攻略大全...
  18. 2021计算机专业考研科目,2021年考研计算机考试科目
  19. 【历史上的今天】3月13日:1986年微软IPO 缔造四位亿万富翁
  20. 自回归模型 java_随机天气模型及其JAVA实现-电子学报.PDF

热门文章

  1. 一部手机背后的小镇青年:吃着蜜糖、喝着毒药
  2. t480 拆触摸板_来自NBC的ThinkPad T480评测:平衡的高端商务笔记本
  3. 怎么把cad的图导入ps_CAD图如何导入Photoshop的方法
  4. win10u盘被写保护怎么解除_win10怎么取消u盘写保护|win10关闭u盘写保护方法
  5. 完全没有建站经验的人,怎么自己做网站
  6. Ubuntu18.04双系统卸载
  7. android微信支付+指纹支付密码错误,为什么微信付款无法指纹支付密码?如何开启指纹支付?...
  8. Android武林大会(转)
  9. 无刷直流电动机的工作原理
  10. 嵌入式开发的学习路径