如何在Spring RestTemplate中发送调用者的IP地址

时间:2017-09-05 11:06:03

标签: java rest spring-mvc resttemplate

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

1 个答案:

答案 0 :(得分:1)

您可以使用 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();
      }