场景:
C客户端---》访问某服务器的某个jsp页面---》跳转至A服务器的a.jsp页面
求 a.jsp页面获取该某服务器的ip地址。

解决方案 »

  1.   

    比如 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分。
      

  2.   

    中间服务器跳转到A服务器是怎么实现的?
    如果中间服务器直接向A服务器请求,那么默认情况下应该是中间服务器的ip吧
      

  3.   

    是先要把问题说清楚。
    客户端是什么?浏览器?
    中转服务器跳到A服务器,是redirect(发送30x给客户端,让客户端自己去访问A)、
    还是通过自己访问A的内容,然后把A内容返回给客户端。
      

  4.   

    楼主你说的跳转,是指 <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的情况。
      

  5.   

    给你个样例参考,注意解析域名是需要消耗时间的:
    <%@ 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
      

  6.   

    C当然是浏览器啦 这里是JAVA WEB 版块 不是么? 当然是 B/S架构中间那个某服务器  和  A服务器 中间是通过 WEBSERVICE 交互的。我不能在 中间那台某服务器上做动作,要求是在 某服务器调用 A服务器提供的WEBSERVICE 服务 后,A服务器能够获得 这台某服务器的IP 注意 这个过程 中间这台某服务器只进行接收客户端的信息 和 调用 A 服务器的 WEBSERVICE与A服务器交互,那些说在 某服务器上传IP给A的 方法是 不正确不安全的。PS:跟SSO安全相关。
      

  7.   

    原来是WebService调用,汗,楼主你顶楼的表达实在是太令人误解了。你用的是什么组件来做WebService的?一般来说Server端(也就是A服务器)都能直接获取ClientIP,也就是某服务器的IP。
    当然故意伪造IP的另当别论。
      

  8.   

    问题是你刚开始完全说的不清不楚
      “访问某服务器的某个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规范了。
      

  9.   


    如果打算控制IP地址,不如直接在操作系统层面搞定,性能比Java至少高1个数量级。如果打算用帐号口令、CA证书啥的来限制,可以借助WS-Security协议来完整,WebService自带。如果想更偷鸡一点,就做个Filter配置进web.xml中,预先拦截WS请求路径,根据ClientIP做过滤。
    不过我还是要提醒下,IP是比较容易Fake的。
      

  10.   

    1L也说了,如果是中间服务器请求A服务器,那么一般情况下A服务器是可以获得中间服务器的IP(除非中间服务器请求时造假IP),对于A来说,中间服务器就是客户端,12L给出了sample了
      

  11.   

    由于宁波市府的环境是weblogic9.2 for linux 
    webservice 的性能实在不敢恭维 已改用 httpClient 这样原始的办法了
    这样可以通过 request 的方式 获取之前的请求 好吧 结贴了
      

  12.   

    我艹 不会吧 服务器没响应 已结贴 怎么会这样 有BUG啊 
      

  13.   


    WebService性能确实稍差。楼主其实可以直接用Srping-Remote,这里面也提供了不少轻量级的远程调用方法,包括类似于HTTP-Remote这种方式的。
      

  14.   

    CSDN真牛B 结贴的分去哪了