2017-09-05 1 views
0

우리는 다른 고객을 위해 사용자 정의하기를 원하기 때문에 우리는 봄의 안락한 apis로부터 UI 코드를 분리 할 계획입니다. 제공된 사용자 이름과 비밀번호에 대해 사용자를 인증하는 나머지 API가 있습니다. 사실 내 UI 패키지에서 나는이 API를 호출하여 Spring RestTemplate으로 인증 된 사용자를 얻고 결과에 따라 적절한 페이지를 반환하는 스프링 컨트롤러를 가지고있다. 인증 API는 요청의 IP 주소를 사용하고 사용자가 잘못된 사용자 이름 암호를 세 번 제공하면 IP 주소를 24 시간 동안 차단합니다. 하지만 문제는이 API를 호출 할 때마다 내 UI 패키지가 배포 된 서버의 IP 주소를 가져오고 발신자가 내 UI 서버 인 것처럼 올바르게 작동하는 것입니다. 그래서 거기에 내 UI 패키지 호출자의 IP 주소를 얻을 수있는 방법은 내 api에 요청을 설정합니다. RestTemplate 요청에서 실제 발신자의 IP를 설정할 수있는 방법이 있습니까?봄에 발신자의 IP 주소를 보내는 방법 RestTemplate

답변

1

당신은 사용하여 작업을 수행 할 수 있습니다 이, 당신의 API 메소드는 매개 변수가 HttpServletRequest의에 대해 정의해야 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 
      } 

그리고 아래와 같이 IP 주소를 얻기 위해 HttpServletRequest의 요청를 사용

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와 백엔드 모두 다른 서버에서 실행되고 있으며 브라우저가 UI 패키지에서 내 컨트롤러에 요청을 보내고 컨트롤러가 백엔드 패키지의 API에 자격 증명을 다시 게시하여 실제로 사용자를 인증하고 응답을 반환하는 것과 같습니다. 귀하의 제안과 함께 UI 컨트롤러에서 호출자 (브라우저)의 IP를 얻을 수 있지만 실제 API에서는 얻을 수 없습니다. 백엔드 Api에서 내 UI 패키지 서버의 IP를 얻었고 로그인을 세 번 잘못 시도하면 실제로 전화를 걸었던 IP를 차단해야한다고 차단할 수는 없습니다. –

관련 문제