xianKOG 2019-03-28 09:29 采纳率: 0%
浏览 315

基于JWS的Webservice,如何获取访问过来的客户端的真实IP,真实的IP

我的WebService是JWS的,我想要获取访问我接口的客户端的真实IP,而不是路由器分配的虚拟IP。
我的方法:

@Resource
    private WebServiceContext webServiceContext;
        MessageContext mc = webServiceContext.getMessageContext();
        HttpExchange exchange = (HttpExchange)mc.get(JAXWSProperties.HTTP_EXCHANGE);
        InetSocketAddress isa = exchange.getRemoteAddress();
        ip = isa.getAddress().getHostAddress(); //获取IP

但是这种方式获取到的IP 并不是真实的,但是网上的解决方法都是这个。
另外还有人说获取HttpServletRequest

HttpServletRequest request= (HttpServletRequest)(mc.get(MessageContext.SERVLET_REQUEST));

但是获取到的HttpServletRequest始终为NULL。
至此,我还是没有解决方法。。如何获取客户端的真实IP,请各位大神帮帮忙

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 14:37
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要获取Web Service调用时使用的客户端真实IP地址,可以使用HttpServletResponse对象来实现。以下是一个简单的示例:

    1. 首先,在你的Web Service中添加一个响应处理器(例如:ResponseWriter.java)并重写 writeExternal() 方法以处理HTTP响应。
    2. 在重写的 writeExternal() 方法中,你可以通过HttpServletRequest对象来获取客户端的真实IP地址。这可以通过从HttpServletResponse对象中获取RequestDispatcherServletRequest实例来完成。
    3. 一旦你有HttpServletRequest实例,你可以通过其getRemoteAddr()方法获取客户端的真实IP地址。

    以下是实现这一功能的示例代码:

    public class MyResponseWriter implements ResponseWriter {
    
        @Override
        public void writeExternal(HttpServletResponse response, HttpServletRequest request) throws IOException {
            response.setContentType("text/html;charset=UTF-8");
            
            try (PrintWriter out = response.getWriter()) {
                out.println("<html><body>");
                out.println("<p>客户端真实IP地址: " + getRealIp(request) + "</p>");
                out.println("</body></html>");
            }
        }
    
        private String getRealIp(HttpServletRequest request) {
            if (request == null) return "";
            RequestDispatcher dispatcher = request.getRequestDispatcher("/real_ip.jsp");
            try {
                dispatcher.include(request, response);
                return response.getHeader("X-Forwarded-For");
            } catch (ServletException | IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    在这个例子中,我们首先在MyResponseWriter类中定义了一个名为writeExternal()的公共方法,它接受一个HttpServletResponse对象和一个HttpServletRequest对象作为参数,并重写了它的默认行为。

    然后,我们在writeExternal()方法中创建一个新的PrintWriter对象,并将其用于生成HTML页面。页面会包含一个段落,其中显示了客户端的真实IP地址。

    接下来,我们重写了getRealIp()方法。如果request对象为空,则返回空字符串。否则,我们尝试通过getRequestDispatcher()方法获取当前请求的RequestDispatcher实例,并利用include()方法将HTML页面包含到响应中。最后,我们检查响应头中的X-Forwarded-For字段是否存在,并根据其值返回客户端的实际IP地址。

    请注意,这段代码仅适用于支持HTTP/1.1的服务器环境。对于其他版本的HTTP协议,可能需要进行一些调整。此外,为了安全起见,你应该确保在实际部署前测试所有可能的情况。

    评论

报告相同问题?