WebService(JAX-WS、XFire、Axis三种)获取客户端ip

JAX-WS、XFire、Axis三种webservice的获取客户端IP的简单实现过程:

1,基于JDK6 jax-ws开发的webservice获取客户端IP地址,Endpoint.publish() 轻量级HTTP服务发布,在web容器tomcat下发布;
2,基于XFire开发的webservice获取客户端IP地址;
3,基于Axis开发的webservice获取客户端IP地址;

一、基于JDK6 jax-ws开发的webservice获取客户端IP地址

1,如果以 Endpoint.publish() 的方式发布:

服务端接口实现类代码(获取的是调用webservice的服务器的IP):

package com.micmiu.jaxws.demo.impl;

import java.net.InetSocketAddress;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import com.micmiu.jaxws.demo.HelloService;
import com.sun.net.httpserver.HttpExchange;
import com.sun.xml.internal.ws.developer.JAXWSProperties; @WebService()
public class HelloServiceImpl implements HelloService { @Resource
private WebServiceContext wsContext; @WebMethod
public String sayHello(@WebParam(name = "userName") String userName) {
getClientInfo();return "";
} private void getClientInfo() {
try {
MessageContext mc = wsContext.getMessageContext();
HttpExchange exchange = (HttpExchange) mc
.get(JAXWSProperties.HTTP_EXCHANGE);
InetSocketAddress isa = exchange.getRemoteAddress();
System.out.println("InetSocketAddress : " + isa);
System.out.println("Hostname : "
+ isa.getAddress().getHostAddress() + " address: "
+ isa.getAddress().getHostName());
} catch (Exception e) {
e.printStackTrace();
}
}
}

客户端调用后,服务端运行日志:

InetSocketAddress : /192.20.100.210:52462
Hostname : 192.20.100.210 address: ADMINIS-3HJ200

2,如果以web容器的方式发布(jetty 或 tomcat为例):

服务端接口实现 代码:

package com.micmiu.jaxws.demo2.impl;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import com.micmiu.jaxws.demo2.HelloService; @WebService(endpointInterface = "com.micmiu.jaxws.demo2.HelloService")
public class HelloServiceImpl implements HelloService { @Resource
private WebServiceContext wsContext; public String sayHello(String userName) {
String clientIP = getClientInfo();
return "JAX-WS with IP: " + clientIP;
} private String getClientInfo() {
String clientIP = null;
try {
MessageContext mc = wsContext.getMessageContext();
HttpServletRequest request = (HttpServletRequest) (mc
.get(MessageContext.SERVLET_REQUEST));
clientIP = request.getRemoteAddr();
System.out.println("client IP : " + clientIP);
} catch (Exception e) {
e.printStackTrace();
} return clientIP;
}
}

客户端调用后,服务端运行日志:

client IP : 192.20.100.210

二、基于XFire开发的webservice获取客户端IP地址

服务端接口实现类代码:

package com.micmiu.xfire.demo.base;

import javax.servlet.http.HttpServletRequest;
import org.codehaus.xfire.transport.http.XFireServletController; public class HelloWorldServiceImpl implements HelloWorldService{
public String sayHello(String username){
String clientIP = getClientInfo();
return "";
} public String getClientInfo() {
String clientIP = null;
try{
HttpServletRequest request = XFireServletController.getRequest();
System.out.println("Addr:"+request.getRemoteAddr()+" host:"+request.getRemoteHost());
clientIP = request.getRemoteAddr();
}catch(Exceptione){
e.printStackTrace();
}
return clientIP;
}
}

客户端调用后,服务端的日志信息如下:

Addr : 192.20.100.210 host: 192.20.100.210
客户端IP :192.20.100.210

三、Axis开发的webservice获取客户端IP地址

服务端代码:

import javax.servlet.http.HttpServletRequest;
import org.apache.axis.MessageContext;
import org.apache.axis.transport.http.HTTPConstants; public class HelloWorld{
public String sayHello(String username){
String clientIP = getClientInfo();
return clientIP ;
} private String getClientInfo() {
MessageContext mc = null;
HttpServletRequest request = null;
String clientIP = null;
try {
mc = MessageContext.getCurrentContext();
request = (HttpServletRequest) mc.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
clientIP = request.getRemoteAddr();
System.out.println("Axis IP >>:"+clientIP);
}catch (Exception e){
e.printStackTrace();
}
return clientIP;
}
}

客户端调用后,服务端的日志信息如下:

Axis IP >>:192.20.100.210

注意:

  在public class AuthFr extends HttpServlet(){}这种类中是获取不到客户端Ip,MessageContext.getCurrentContext()值为空;--待解决

  当然,如果只是获取真实的客户端IP可以采用request.getRemoteAddr();

  这里要获取的是A(真实客户端)通过访问B(服务器B)发布的网站再访问C(服务器C)的网站;这里服务器C上要获取服务器B的IP;

  换句话理解就是只能通过服务器B才能访问到服务器C,其他IP都需要过滤;

  这种情况,利用上诉方式在普通类中可以实现获取服务器B的IP,但是在public class AuthFr extends HttpServlet(){}这种类中确实null;

 

WebService(JAX-WS、XFire、Axis三种)获取客户端ip的更多相关文章

  1. Request三种获取数据的方式

    今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...

  2. Js之Dom学习-三种获取页面元素的方式、事件、innerText和innerHTML的异同

    一.三种获取页面元素的方式: getElementById:通过id来获取 <body> <input type="text" value="请输入一个 ...

  3. JS获取客户端IP地址、MAC和主机名七种方法

    一.使用JS获取客户端IP的几个方法方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000).获取客户端IP代码:<HTML><HEAD ...

  4. php获取客户端IP地址的几种方法(转)

    [php] view plain copy php获取客户端IP地址的几种方法 方法一 <?php $iipp=$_SERVER["REMOTE_ADDR"]; echo $ ...

  5. WebService及WCF获取客户端IP,端口

    wcf获取客户端IP,端口 var context = OperationContext.Current; var properties = context.IncomingMessageProper ...

  6. Haproxy的三种保持客户端会话保持方式

    2017-03-25 15:41:41   haproxy 三种保持客户端Seesion; 一.源地址hash(用户IP识别) haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类 ...

  7. 深入分析几种PHP获取客户端IP的情况转

    转 http://developer.51cto.com/art/200912/166495.htm function getip() { $unknown = 'unknown'; if (isse ...

  8. asp.net获取客户端IP方法(转载)

    最近web获取客户端ip,看到下面这篇文章,转载过来,一起分享(转载地址:http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html) 通 ...

  9. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

随机推荐

  1. logstash实战tcp插件

    vim /etc/logstash/conf.d/tcp.conf input{ tcp{ type => "tcp" port => "6666" ...

  2. 1067 - Combinations---LightOj(Lucas求组合数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1067 模板求C(n,m)%p, Lucas模板; #include <iostr ...

  3. 正则表达式(三):Unicode诸问题下篇(转)

    原文:http://www.infoq.com/cn/news/2011/04/regular-expressions-4 我们使用正则表达式,熟练掌握各种功能和结构只是手段,解决实际的问题才是真正的 ...

  4. 匿名内部类的参数引用只能是final,可能遇到的问题及其解决

    这个是我碰到比较多次的问题,一开始是不解,不过查了下大家都觉得没什么,而且只是加个final好像影响也不大,于是我就直接加个final了事,之后也不管了 直到昨天: 遇到了这个宿命般的问题 难道解决方 ...

  5. java 泛型没有协变类型, 所以要重用extends, 但使用List<? extends Fruit> 可以是ArrayList<Fruit>()、ArrayList<Apple>()、ArrayList<Orange>(), 因此不能add元素进去

    class Fruit{} class Apple extends Fruit{} class SubApple extends Apple{} class Orange extends Fruit{ ...

  6. 关于找不到类org/apache/commons/lang/xwork/StringUtils的问题

    在替换最新版的 struts2包的解决过程中.遇到 找不到这两个包org/apache/commons/lang/xwork/StringUtils.org/apache/commons/lang/x ...

  7. backreference Oracle正則表達式中的反向引用

      这是Oracle对正則表達式的backreference的描写叙述 从定义中能够看到,当匹配表达式中已()的形式将一个子串包括起来.后面就能够以\? 的形式来引用.\1相应第一个(),\2相应第二 ...

  8. Lodash入门介绍

    原文额地址  http://www.w3cplus.com/javascript/lodash-intro.html 有多年开发经验的工程师,往往都会有自己的一套工具库,称为 utils.helper ...

  9. union 类型(即sum types)在golang语言中的实现

    http://www.jerf.org/iri/post/2917 Sum Types in Go posted Jun 02, 2013 in Programming, Golang, Haskel ...

  10. 如何实现在H5里调起高德地图APP?

    http://www.cnblogs.com/milkmap/p/5912350.html 这一篇文章,将讲述如何在H5里调起高德地图APP,并展示兴趣点.适合于展示某个餐馆,商场等,让用户自行选择前 ...