有这样一个需要求,公司这边做的是VIP 相当于网关,所有的主机请求,先走它然后它负责转发,而我的应该需要得到真实的主机IP地址进行限制,去网上找了一段代码如下:
public 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();
}
return ip;
}
可还是得到的VIP的那台主机的IP地址,有类似做过这样的功能的吗?求教下
事实你的VIP那台机器差不多就是反向代理,你这边要想拿到真实的IP,VIP那台机器必须要把真实的VIP传过来...
也就是说VIP机器拿到真实IP后,要再把它设置到request header里,header name应该为x-forwarded-for;
当然VIP机器可以自己定义一个名字,你这边拿到定义的那个名字.
试试 用 request.getHeader("X-Real-IP"); 来获取。
如果是通过vpn之类的网关过来的请求,除非你自己在客户端那边把客户的ip地址上送回来,否则不论你用的什么方法,得到的都是你vpn的网关的ip地址
可以看下 Header 里面都有什么内容
[code="java"] java.util.Enumeration it = request.getHeaderNames();
String key;
while(it.hasMoreElements()) {
key = it.nextElement();
System.out.println(key + " = " + request.getHeader(key));
}[/code]
要通过VIP得到真实的客户端地址,VIP这儿必须把真实的ip地址通过某种方式传递给服务器端,在HTTP协议里就是通过HTTP Header来传递的,常用的HTTP Header名称就是x-forwarded-for,也可以自定义一个头的名字,协商好了就ok.
可以用dyccsxg 的方法列印出从VIP过来的所有HTTP头信息,从里面找找有没有真实的客户端地址,有的话用的是哪个头名字,然后再修改你的程序使之相匹配,没有的话看看VIP那边有没有啥参数设置可以传递真实的客户端ip地址
首先你需要在vip的软件或硬件上设置,将真实ip映射到http某个名字的header上,一般常用的为X-FORWARDED-FOR或X-REAL-IP,也可自己设
LVS没有配置过,不知道怎么搞.
不过从自己租的VPS来看,他在物理机是搞了一个squid反向代理的.这样就可以把真实IP通过header传过去.
而且,这样可以实现物理机的外网IP的80端口共用.
上新浪微博直接问问章博士吧。
[url=http://weibo.com/wensong8]http://weibo.com/wensong8[/url]
章文嵩,Linux内核开发者,淘宝核心系统研发负责人,LVS集群项目创始人与开发者,热心于开源活动和布道