• 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;

  • 相关阅读:
    批量插入数据&自定义分页器
    ajax
    Django 多对多表关系的三种创建方式
    Django ORM之F与Q查询
    Django ORM跨表查询&聚合、分组查询
    Django ORM多表操作
    Django ORM单表操作常用字段
    HashMap的容量大小增长原理(JDK1.6/1.7/1.8)
    80端口被占用
    中级视频地址
  • 原文地址:https://www.cnblogs.com/lizm166/p/8058715.html
Copyright © 2020-2023  润新知