关于获得来访服务器的IP的问题。 场景:C客户端---》访问某服务器的某个jsp页面---》跳转至A服务器的a.jsp页面求 a.jsp页面获取该某服务器的ip地址。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 比如 c的IP为 21.21.21.21 ,某服务器ip为 10.10.10.10 ,在A服务器的a.jsp页面应该显示的是 10.10.10.10而不是 21.21.21.21 ,因为某服务器不定,所以不能指定 10.10.10.10 这样的ip。是有点难度,考虑好了说下 解决问题 再追加700分。 中间服务器跳转到A服务器是怎么实现的?如果中间服务器直接向A服务器请求,那么默认情况下应该是中间服务器的ip吧 是先要把问题说清楚。客户端是什么?浏览器?中转服务器跳到A服务器,是redirect(发送30x给客户端,让客户端自己去访问A)、还是通过自己访问A的内容,然后把A内容返回给客户端。 楼主你说的跳转,是指 <a href="http://A服务器/a.jsp"> 这种方式么?默认情况下,跳转会在HTTP协议的Head中有一个Referer信息,比如:Referer: http://www.google.com.hk/url?sa=t&rct=j&q=baidu&source=web&cd=1&ved=0CGEQFjAA&url=http%3A%2F%2Fwww.baidu.com%2F&ei=29zZT_TSHuehiAfZ-ayaAw&usg=AFQjCNHejwhPeR5sVWA-xGcAwx71OwG6tw&cad=rjtReferer: http://www.baidu.com/Referer: http://www.sina.com.cn/然后可以通过DNS解析该域名得知从哪个服务器跳转过来的。但是!!Referer这个Head信息,可以被故意消除掉的,也就是可能存在虽然是跳转过来的,但你仍然拿不到Referer的情况。 给你个样例参考,注意解析域名是需要消耗时间的:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="java.net.*" %><% String from = request.getHeader("Referer"); String host = null; String ip = null; if (from != null) { URL url = new URL(from); host = url.getHost(); ip = InetAddress.getByName(host).getHostAddress(); }%>Page referer: <%=from%><br>Referer Server Name: <%=host%><br>Referer Server IP: <%=ip%><br><br><br><a href="http://localhost:8080/getRef.jsp">Please Click This Link</a>本机测试效果(第一次访问):Page referer: null Referer Server Name: null Referer Server IP: null Please Click This Link本机测试效果(点击超链接后):Page referer: http://localhost:8080/getRef.jsp Referer Server Name: localhost Referer Server IP: 127.0.0.1 Please Click This Link C当然是浏览器啦 这里是JAVA WEB 版块 不是么? 当然是 B/S架构中间那个某服务器 和 A服务器 中间是通过 WEBSERVICE 交互的。我不能在 中间那台某服务器上做动作,要求是在 某服务器调用 A服务器提供的WEBSERVICE 服务 后,A服务器能够获得 这台某服务器的IP 注意 这个过程 中间这台某服务器只进行接收客户端的信息 和 调用 A 服务器的 WEBSERVICE与A服务器交互,那些说在 某服务器上传IP给A的 方法是 不正确不安全的。PS:跟SSO安全相关。 原来是WebService调用,汗,楼主你顶楼的表达实在是太令人误解了。你用的是什么组件来做WebService的?一般来说Server端(也就是A服务器)都能直接获取ClientIP,也就是某服务器的IP。当然故意伪造IP的另当别论。 问题是你刚开始完全说的不清不楚 “访问某服务器的某个jsp页面---》跳转至A服务器的a.jsp页面”我7楼所提方案,在JSP层面,是可以直接获取到来源地址的,无需对“某服务器”做任何改动。回到正题,这类实现很多,看你用的是什么WebService组件,比如如果是CXF的话,可以参考这里:http://blog.csdn.net/rena5460/article/details/5342300关键就这么几句话:private WebServiceContext context; // 注入的WebService服务上下文MessageContext ctx = context.getMessageContext(); // 获取本次消息上下文HttpServletRequest request = (HttpServletRequest)ctx.get(AbstractHTTPDestination.HTTP_REQUEST); // 获取HTTP原始请求String ip=request.getRemoteAddr(); // 直接获取ClientIP,这个是J2EE规范了。 如果打算控制IP地址,不如直接在操作系统层面搞定,性能比Java至少高1个数量级。如果打算用帐号口令、CA证书啥的来限制,可以借助WS-Security协议来完整,WebService自带。如果想更偷鸡一点,就做个Filter配置进web.xml中,预先拦截WS请求路径,根据ClientIP做过滤。不过我还是要提醒下,IP是比较容易Fake的。 1L也说了,如果是中间服务器请求A服务器,那么一般情况下A服务器是可以获得中间服务器的IP(除非中间服务器请求时造假IP),对于A来说,中间服务器就是客户端,12L给出了sample了 由于宁波市府的环境是weblogic9.2 for linux webservice 的性能实在不敢恭维 已改用 httpClient 这样原始的办法了这样可以通过 request 的方式 获取之前的请求 好吧 结贴了 我艹 不会吧 服务器没响应 已结贴 怎么会这样 有BUG啊 WebService性能确实稍差。楼主其实可以直接用Srping-Remote,这里面也提供了不少轻量级的远程调用方法,包括类似于HTTP-Remote这种方式的。 CSDN真牛B 结贴的分去哪了 关于接口的问题 高薪诚聘北京地区JSP开发高手!!急急急 100分求COBOL电子书!!!!!!!!!!1 关于JS方面的问题,请问高手们帮帮忙哦!源代码发出来了 请问各位高手;用JFreeChart作柱图时,怎样设置柱的宽度? 16进制的转化问题 请教各位 很简单的问题!!! 快疯了:怎样从JSP中向Oracle_816中插入LONG型字符串? playframework2.x 中,如何实现过滤器的效果 js中如何传值给servlet 求帮助! 急
而不是 21.21.21.21 ,因为某服务器不定,所以不能指定 10.10.10.10 这样的ip。
是有点难度,考虑好了说下 解决问题 再追加700分。
如果中间服务器直接向A服务器请求,那么默认情况下应该是中间服务器的ip吧
客户端是什么?浏览器?
中转服务器跳到A服务器,是redirect(发送30x给客户端,让客户端自己去访问A)、
还是通过自己访问A的内容,然后把A内容返回给客户端。
Referer: http://www.google.com.hk/url?sa=t&rct=j&q=baidu&source=web&cd=1&ved=0CGEQFjAA&url=http%3A%2F%2Fwww.baidu.com%2F&ei=29zZT_TSHuehiAfZ-ayaAw&usg=AFQjCNHejwhPeR5sVWA-xGcAwx71OwG6tw&cad=rjtReferer: http://www.baidu.com/Referer: http://www.sina.com.cn/然后可以通过DNS解析该域名得知从哪个服务器跳转过来的。但是!!Referer这个Head信息,可以被故意消除掉的,也就是可能存在虽然是跳转过来的,但你仍然拿不到Referer的情况。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
String from = request.getHeader("Referer");
String host = null;
String ip = null;
if (from != null) {
URL url = new URL(from);
host = url.getHost();
ip = InetAddress.getByName(host).getHostAddress();
}
%>
Page referer: <%=from%>
<br>
Referer Server Name: <%=host%>
<br>
Referer Server IP: <%=ip%>
<br>
<br>
<br>
<a href="http://localhost:8080/getRef.jsp">Please Click This Link</a>
本机测试效果(第一次访问):
Page referer: null
Referer Server Name: null
Referer Server IP: null
Please Click This Link
本机测试效果(点击超链接后):
Page referer: http://localhost:8080/getRef.jsp
Referer Server Name: localhost
Referer Server IP: 127.0.0.1
Please Click This Link
当然故意伪造IP的另当别论。
“访问某服务器的某个jsp页面---》跳转至A服务器的a.jsp页面”
我7楼所提方案,在JSP层面,是可以直接获取到来源地址的,无需对“某服务器”做任何改动。
回到正题,这类实现很多,看你用的是什么WebService组件,比如如果是CXF的话,可以参考这里:
http://blog.csdn.net/rena5460/article/details/5342300关键就这么几句话:
private WebServiceContext context; // 注入的WebService服务上下文MessageContext ctx = context.getMessageContext(); // 获取本次消息上下文
HttpServletRequest request = (HttpServletRequest)
ctx.get(AbstractHTTPDestination.HTTP_REQUEST); // 获取HTTP原始请求
String ip=request.getRemoteAddr(); // 直接获取ClientIP,这个是J2EE规范了。
如果打算控制IP地址,不如直接在操作系统层面搞定,性能比Java至少高1个数量级。如果打算用帐号口令、CA证书啥的来限制,可以借助WS-Security协议来完整,WebService自带。如果想更偷鸡一点,就做个Filter配置进web.xml中,预先拦截WS请求路径,根据ClientIP做过滤。
不过我还是要提醒下,IP是比较容易Fake的。
webservice 的性能实在不敢恭维 已改用 httpClient 这样原始的办法了
这样可以通过 request 的方式 获取之前的请求 好吧 结贴了
WebService性能确实稍差。楼主其实可以直接用Srping-Remote,这里面也提供了不少轻量级的远程调用方法,包括类似于HTTP-Remote这种方式的。