Java 如何在spring RestTemplate中发送调用方的Ip地址

Java 如何在spring RestTemplate中发送调用方的Ip地址,java,rest,spring-mvc,resttemplate,Java,Rest,Spring Mvc,Resttemplate,我们计划将UI代码从spring restful API中分离出来,因为我们希望为不同的客户定制UI。我们有一个RESTAPI,它根据提供的用户名和密码对用户进行身份验证。实际上,在我的UI包中,我有一个spring控制器,它调用这个api来使用spring RestTemplate对用户进行身份验证,并根据结果返回适当的页面。身份验证api使用来自请求的IP地址,如果有人三次提供错误的用户名密码,则会将IP地址阻止24小时。但问题是,每次我调用这个api时,它都会获取部署UI包的服务器IP地址

我们计划将UI代码从spring restful API中分离出来,因为我们希望为不同的客户定制UI。我们有一个RESTAPI,它根据提供的用户名和密码对用户进行身份验证。实际上,在我的UI包中,我有一个spring控制器,它调用这个api来使用spring RestTemplate对用户进行身份验证,并根据结果返回适当的页面。身份验证api使用来自请求的IP地址,如果有人三次提供错误的用户名密码,则会将IP地址阻止24小时。但问题是,每次我调用这个api时,它都会获取部署UI包的服务器IP地址,我想这是正确的行为,因为调用方是我的UI服务器。那么,有没有一种方法可以在我的UI包上获取调用者的IP地址,并将其设置为我对api发出的请求。是否有一种方法可以在RestTemplate请求中设置实际调用方的IP。

您可以使用HttpServletRequest进行设置,您的api方法应该为HttpServletRequest定义参数

您的api方法应该如下所示:

 @RequestMapping(value = "/myApiPath", method = RequestMethod.GET)
          public void myApiMethod(MyObject myobject, final HttpServletRequest request) throws IOException {
                String ipAddress=getIpAddressOfRequest(request); // get Ip address
          }
然后使用HttpServletRequest请求获取ip地址,如下所示:

public static String getIpAddressOfRequest(final HttpServletRequest request) {
            String remoteAddr = "";
            if (request != null) {
                remoteAddr = request.getHeader("X-FORWARDED-FOR");
                if (remoteAddr == null || "".equals(remoteAddr)) {
                    remoteAddr = request.getRemoteAddr();
                }
            }
            return remoteAddr;
      }
甚至您也可以通过使用以下代码获取服务器名称来获得域名条件:

public static String getProtocolHostnameAndPort(final HttpServletRequest request) {
            String protocol = request.getProtocol().split("/")[0].toLowerCase();
            String hostname = request.getServerName();
            int port = request.getServerPort();
            StringBuilder result = new StringBuilder(protocol + "://" + hostname);
            if (port != 80) {
                  result.append(":").append(port);
            }
            return result.toString();
      }

谢谢你的快速回复。实际上,UI和后端都在不同的服务器上运行,我的流程就像浏览器在UI包中向我的控制器发出请求,控制器将再次将凭据发布到后端包中的API,该API将实际验证用户并返回响应。根据您的建议,我可以在UI控制器中获取调用方(浏览器)的IP,但不能在实际Api中获取。在后端Api中,我得到我的UI包服务器的IP,我无法阻止,如果三次错误尝试登录,我需要阻止实际进行调用的IP。