WebService(JAX-WS、XFire、Axis三種)獲取客戶端ip


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;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM