2017-09-05 135 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。 –