-
域名中ip和端口的问题,java通过域名获取ip
2017-06-01 18:02:45如何通过域名获取ip,以及与端口关系的问题之前用java发送http请求的时候一般都是ip+port。
如http://192.168.110.123:8800/yxl
后来遇到请求是域名的情况:
发现不见了端口,采用java去解析:
try {
InetAddress address = InetAddress.getByName("www.yxl.com");
System.out.println(address.getHostAddress());
} catch (Exception e) {
e.printStackTrace();
}
只能得到ip,得不到端口。(www.yxl.com是自己在hosts配置的,配置方法可查看该博主的其他章节:nginx中修改server_name无效,修改为www.test.com无法访问,通过localhost可以访问
后来查阅资料发现,通过域名访问时,若不是默认端口(80)时需要在域名后指明,如Tomcat的后面需要加8080:http://localhost:8080/yxl。
若不指明,则是访问默认端口:80。
如访问百度www.baidu.com与www.baidu.com:80效果是一样的。
-
实时获取端口号和ip地址(域名)
2019-03-11 11:29:01使用自定义获取端口号和ip地址(域名)window.location 在项目当中,很多项目是属于外包的,当项目做完就需要部署然后交给甲方,那么此时项目就不是我们负责 端口号,和域名,后期因为部署到服务器上就不是我们管,然后是...使用自定义获取端口号和ip地址(域名)window.location
在项目当中,很多项目是属于外包的,当项目做完就需要部署然后交给甲方,那么此时项目就不是我们负责
端口号,和域名,后期因为部署到服务器上就不是我们管,然后是别人负责,就是想实现我在这个机子上打开是这个端口号和域名,在另外一个机子上打开又是另外一个端口号和域名直接跟接口拼接起来var domain=window.location.host; //获取当前域名(ip)和端口号 var url='http://'+domain+'/zz-viewplatform/scenicViewData/allScenicViewData'; function getPageInfo () { $.ajax({ url: url, type: 'get', dataType: 'json', success: function (data) { console.log(data); vueData.pageInfo = data; } }) } getPageInfo();
window.location下的属性说明
属性 说明 window.location.href 完整的url window.location.protocol 协议 window.location.hostname 主机名 window.location.host 主机名+端口号 window.location.por t端口号 window.location.pathname 当前URL的路径部分 var href = window.location.href;//完整的url
var protocol = window.location.protocol;//协议
var hostname = window.location.hostname;//主机名
var host = window.location.host;//主机名+端口号
var port = window.location.port;//端口号
var pathname = window.location.pathname;//当前URL的路径部分
var search = window.location.search;//路径的查询部分
var hash = window.location.hash;//开始的锚点 -
JavaScript 获取当前站点的域名和端口号
2019-08-13 16:14:28例:本地IP形式: http://127.0.0.1:8083/admin 线上域名:https://www.csdn.net/ 获取域名(第一种方法):location.host = 127.0.0.1:...获取域名 (第二种方法):window.location.host = 127.0.0.1:8083 ...例:本地IP形式: http://127.0.0.1:8083/admin 线上域名: https://www.csdn.net/
获取域名(第一种方法):location.host = 127.0.0.1:8083 www.csdn.net
获取域名 (第二种方法):window.location.host = 127.0.0.1:8083 www.csdn.net
获取域名(第三种方法):document.domain = 127.0.0.1 www.csdn.net
获取域名(第四种方法):location.hostname = 127.0.0.1 www.csdn.net
获取端口号:location.port = 8083
需要注意的是获取的域名不包括“http://”。
下面我写的页面获取域名地址:
该js会在页面全部加载后执行
window.οnlοad=function (){ var port = location.port; var hostUrl = "http://"; hostUrl += location.host + "/admin"; $(".logo-img-box").attr("href",hostUrl) }
-
【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!
2020-07-10 14:54:37写在前面 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻...注意:本文中的客户端信息指的是:客户端真实IP、域名、协议、端口。 Nginx反向代理后,Servle写在前面
Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者或者公司基于Nginx开发出了众多的高性能插件。使用者可以根据自身的需求来为Nginx指定某款插件以增强Nginx在某种特定场景下的功能或者提升Nginx在某种特定场景下的性能。
Nginx获取客户端信息
注意:本文中的客户端信息指的是:客户端真实IP、域名、协议、端口。
Nginx反向代理后,Servlet应用通过
request.getRemoteAddr()
取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()
获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端浏览器地址栏上的真实域名、协议、端口。直接获取信息存在哪些问题?
例如在某一台IP为192.168.1.100的服务器上,Jetty或者Tomcat端口号为8080,Nginx端口号80,Nginx反向代理8080端口:
server { listen 80; location / { proxy_pass http://127.0.0.1:8080; # 反向代理应用服务器HTTP地址 } }
在另一台机器上用浏览器打开http://192.168.1.100/test访问某个Servlet应用,获取客户端IP和URL:
System.out.println("RemoteAddr: " + request.getRemoteAddr()); System.out.println("URL: " + request.getRequestURL().toString());
打印的结果信息如下:
RemoteAddr: 127.0.0.1 URL: http://127.0.0.1:8080/test
可以发现,Servlet程序获取到的客户端IP是Nginx的IP而非浏览器所在机器的IP,获取到的URL是Nginx proxy_pass配置的URL组成的地址,而非浏览器地址栏上的真实地址。如果将Nginx用作https服务器反向代理后端的http服务,那么
request.getRequestURL()
获取的URL是http前缀的而非https前缀,无法获取到浏览器地址栏的真实协议。如果此时将request.getRequestURL()
获取得到的URL用作拼接Redirect地址,就会出现跳转到错误的地址,这也是Nginx反向代理时经常出现的一个问题。如何解决这些问题?
既然直接使用Nginx获取客户端信息存在问题,那我们该如何解决这个问题呢?
我们整体上需要从两个方面来解决这些问题:
(1)由于Nginx是代理服务器,所有客户端请求都从Nginx转发到Jetty/Tomcat,如果Nginx不把客户端真实IP、域名、协议、端口告诉Jetty/Tomcat,那么Jetty/Tomcat应用永远不会知道这些信息,所以需要Nginx配置一些HTTP Header来将这些信息告诉被代理的Jetty/Tomcat;
(2)Jetty/Tomcat这一端,不能再获取直接和它连接的客户端(也就是Nginx)的信息,而是要从Nginx传递过来的HTTP Header中获取客户端信息。
具体实践
配置nginx
首先,我们需要在Nginx的配置文件nginx.conf中添加如下配置。
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。
此时,再试一下
request.getRemoteAddr()
和request.getRequestURL()
的输出结果:RemoteAddr: 127.0.0.1 URL: http://192.168.1.100/test
可以发现URL好像已经没问题了,但是IP还是本地的IP而非真实客户端IP。但是如果是用Nginx作为https服务器反向代理到http服务器,会发现浏览器地址栏是https前缀但是
request.getRequestURL()
获取到的URL还是http前缀,也就是仅仅配置Nginx还不能彻底解决问题。通过Java方法获取客户端信息
仅仅配置Nginx不能彻底解决问题,那如何才能解决这个问题呢?一种解决方式就是通过Java方法获取客户端信息,例如下面的Java方法。
/*** * 获取客户端IP地址;这里通过了Nginx获取;X-Real-IP */ public static String getClientIP(HttpServletRequest request) { String fromSource = "X-Real-IP"; String ip = request.getHeader("X-Real-IP"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); fromSource = "X-Forwarded-For"; } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); fromSource = "Proxy-Client-IP"; } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); fromSource = "WL-Proxy-Client-IP"; } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); fromSource = "request.getRemoteAddr"; } return ip; }
这种方式虽然能够获取客户端的IP地址,但是我总感觉这种方式不太友好,因为既然Servlet API提供了
request.getRemoteAddr()
方法获取客户端IP,那么无论有没有用反向代理对于代码编写者来说应该是透明的。接下来,我就分别针对Jetty服务器和Tomcat服务器为大家介绍下如何进行配置才能更加友好的获取客户端信息。
Jetty服务器
在Jetty服务器的jetty.xml文件中,找到
httpConfig
,加入配置:<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> ... <Call name="addCustomizer"> <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg> </Call> </New>
重新启动Jetty,再用浏览器打开http://192.168.1.100/test测试,结果:
RemoteAddr: 192.168.1.100 URL: http://192.168.1.100/test
此时可发现通过
request.getRemoteAddr()
获取到的IP不再是127.0.0.1
而是客户端真实IP,request.getRequestURL()
获取的URL也是浏览器上的真实URL,如果Nginx作为https代理,request.getRequestURL()
的前缀也会是https。另外,Jetty将这个功能封装成一个模块:http-forwarded。如果不想改jetty.xml配置文件的话,也可以启用http-forwarded模块来实现。
例如可以通过命令行启动Jetty:
java -jar start.jar --module=http-forwarded
更多Jetty如何启用模块的相关资料可以参考:http://www.eclipse.org/jetty/documentation/current/startup.html
Tomcat
和Jetty类似,如果使用Tomcat作为应用服务器,可以通过配置Tomcat的server.xml文件,在Host元素内最后加入:
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
好了,咱们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一起学习一起进步!!
写在最后
如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!
-
【nginx系列】如何获取客户端真实IP、域名、协议、端口
2020-07-17 19:54:54前言 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中。这不仅仅是因为Nginx本身比较轻量,更...注意:本文中的客户端信息指的是:客户端真实IP、域名、协议、端口。 Nginx反向代理后,Se -
【Tomcat】-- Tomcat + Nginx反向代理https和wss并解决获取客户端真实IP、域名、协议、端口
2017-08-14 15:25:43刚开始只做了http和ws,由于做小程序必须要https和wss,无奈将服务器http进行https转换,ws做wss转换。 首先我们得申请https证书,请参考前面的博客。 第二全站https化 -
域名解析到指定端口_南京课工场IT培训:搭建nginx虚拟主机——基于域名、端口和IP...
2020-11-28 08:34:30Nginx支持的虚拟主机有三种1、基于域名的虚拟主机2、基于IP的虚拟主机3、基于端口的虚拟主机且每一种虚拟主机均可通过“server{}" 配置段实现各自的功能一、基于域名搭建1、编译安装Nginx服务2、远程获取Windows上的... -
ip地址和端口号
2020-12-31 09:26:28req.socket.remoteAddress //获取当前请求客户端的IP地址 理解IP地址和端口号 ip地址分配给网卡,一个网卡对应一个IP;如果一台计算机有多个网卡,则有多个ip;在同一个局域网内,ip地址不能相同 网络只能使用ip... -
Java Web --- 域名 IP 端口的封装类
2018-08-08 10:39:32封装域名和地址,不包含端口信息 获取对象的方法,没有对外开放的构造方法,因此通过返回InetAddress对象的静态方法进行实例化 InetAddress.getLocalHost(); InetAddress.getByName("www.abc.com");/... -
C# 根据域名获取IP地址
2014-04-16 11:27:00今天做海康微视视频接口的时候要用到硬盘录像机的IP地址、端口号、用户名和密码。 但是发现客户IP地址是动态获取的,经常变化。 所以需要根据域名解析出IP。 代码如下 //判断输入的是否是IP Regex rx = ... -
如何获取一个http服务真实内网IP地址及端口
2018-03-01 07:17:36telnet那个外网IP和端口号可以得到这些,只能确定是NGINX服务 HTTP/1.1 400 Bad Request Server: nginx Date: Thu, 01 Mar 2018 08:04:18 GMT Content-Type: text/html Content-Length: 166 Connection: close... -
System.Uri类 - 获取Url的各种属性,文件名,参数,域名,端口等等
2016-11-23 17:29:00System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以说是一个非常有用...Authority 获取服务器的域名系统 (DNS) 主机名或 IP 地址和端口号。DnsSafeHost ... -
socket客户端获取本端的端口
2019-05-02 12:15:22对于客户端socket,一般创建socket后,直接链接服务器的ip和端口, 一般来说,我们知道服务器的ip/域名和端口号,但是本端我们一般默认,不进行显示的绑定固定端口,系统会默认自动分配空闲的端口。 一般我们不需要... -
java积累--获取客户端访问的url和域名--EL表达式获取地址栏地址以及jsp如何获取服务器信息
2016-04-06 16:29:41JAVA获取域名或者ip相关信息的方法 request.getServerName() 返回被请求服务器域名,如果没有域名则返回IP地址:10.0.4.214 request.getServerPort() 返回被请求服务器端口:8081 request.getRemoteHost(... -
对于ip和域名的一点思考
2017-02-19 10:55:09前奏:以往所知到的ip需要和域名进行绑定,在dns服务器上相应的域名就可以被解析成ip然后选择去哪个主机访问,比如www.baidu.com,最终访问119.75.218.70这个ip,ip为主机的唯一识别码。问题:如果在服务器上发布两... -
网络安全:01---Web安全(信息收集:域名、备案、IP、端口、CMS、CND、敏感数据、社工库)
2019-07-07 09:42:46概念 进行渗透测试之前, 最重要的一步就是信息...知道目标的域名之后,我们要做的第一件事就是获取域名的注册信息,包括该域名的DNS服务器信息和注册人的联系信息等 Whois命令查询 whios的概念:Whois 是一个... -
c# uri 取文件名_C# System.Uri类_获取Url的各种属性_文件名_参数_域名_端口等等
2020-12-20 03:16:12System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以...Authority 获取服务器的域名系统 (DNS) 主机名或 IP 地址和端口号。DnsSafeHost 获得可安全用于 ... -
正则表达式验证url去掉协议域名和端口号_浅析 URL
2020-12-01 06:23:53URL,又叫做统一资源定位服务。他跟HTTP与HTML一起,构成了www万维网的规则。URL包含以下几部分:协议+域名或IP+端口号+路径+...IP分为内网IP和外网IP,通常由路由器获取和分配。一般而言,路由器把网络分成外网和... -
c# uri 取文件名_System.Uri类 - 获取Url的各种属性,文件名,参数,域名,端口等等...
2020-12-20 03:15:37System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以...Authority 获取服务器的域名系统 (DNS) 主机名或 IP 地址和端口号。DnsSafeHost 获得可安全用于 ... -
java获取url前缀 jsp_java积累--获取客户端访问的url和域名--EL表达式获取地址栏地址以及jsp如何获取服务器...
2021-01-16 00:05:22123.10.23.12部署网页的服务器ip为:10.0.4.214JAVA获取域名或者ip相关信息的方法request.getServerName()返回被请求服务器域名,如果没有域名则返回IP地址:10.0.4.214request.getServerPort()返回被请求服务器端口:... -
Nginx反向代理后应用程序获取客户端真实IP
2019-05-18 16:22:00Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端... -
nginx反向代理后应用程序如何获取客户端真实IP?
2017-10-30 10:32:03Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端... -
ip访问页面可与请求到数据,域名访问却获取不到,反之亦然
2020-07-17 11:37:25我们知道,ajax请求跨域无非是,协议,域名。端口不一样导致的跨域。...也就是说,如果你浏览器地址栏使用的是域名访问,但实际ajax请求f访问的是ip(或者反过来),也是跨域,这时就要统一,接口..
-
基于SSM实现的房屋租赁系统【附源码】(毕设)
-
TL1788_V0.8_20060401.pdf
-
PPT大神之路高清教程
-
Dos命令
-
TL1772_Initial_Rev1.0.pdf
-
Markdown语法
-
app软件测试全栈系列精品课程
-
华为1+X认证——网络系统建设与运维(初级)
-
NFS 实现高可用(DRBD + heartbeat)
-
【布道者】Linux极速入门
-
TL1771S_V0.2_20060508.pdf
-
MySQL 主从复制 Replication 详解(Linux 和 W
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
java 字节数组作用_这段java代码中字节数组b起到了什么作用?
-
【函数分享】每日PHP函数分享(2021-3-1)
-
TL1771 COG Application Guide_V0.3_20041202.pdf
-
2021Python必刷面试题(带答案)
-
定时器初值计算.rar
-
Mysql数据库面试直通车
-
汉PIC10F200.pdf