2017-09-05 131 views
0

我们计划将我们的UI代码与我们的春天宁静的apis分开,因为我们希望为不同的客户端定制ui。我们有一个休息api,它根据用户名和密码提供身份验证用户。实际上,在我的UI包中,我有一个弹簧控制器,它调用这个api让用户使用Spring RestTemplate进行身份验证,并根据结果返回适当的页面。如果有人提供三次错误的用户名密码,身份验证API将使用请求中的IP地址并阻止IP地址24小时。但问题是我每次调用这个api时,都会得到我的服务器的IP地址,我的UI包被部署在这里,我想这是正确的行为,因为调用者是我的UI服务器。那么有没有一种方法可以在我的UI包中获取调用者的IP地址,并将其设置为我对api所做的请求。有没有一种方法可以在RestTemplate请求中设置实际的呼叫者的IP。如何在春季发送呼叫者的IP地址RestTemplate

回答

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(); 
     } 
+0

感谢您的快速回复。实际上,UI和后端都运行在不同的服务器上,我的流程就像Browser将在UI包中向我的控制器发出请求,并且控制器将再次将凭证发布到后端包中的API,这将实际验证用户身份并返回响应。与您的建议我可以得到调用者(浏览器)在UI控制器的IP,但不是在实际的Api。在后端Api我得到我的用户界面包服务器的IP,我不能阻止,如果三个错误的尝试登录我需要阻止实际上已经打电话的IP。 –