Programing

Spring MVC Controller에서 IP 주소를 추출하는 방법은 무엇입니까?

lottogame 2020. 11. 16. 07:47
반응형

Spring MVC Controller에서 IP 주소를 추출하는 방법은 무엇입니까?


브라우저에서 GET URL 호출을 만드는 Spring MVC 컨트롤러 프로젝트에서 작업 중입니다.

아래는 브라우저에서 GET 호출을하는 URL입니다.

http://127.0.0.1:8080/testweb/processing?workflow=test&conf=20140324&dc=all

그리고 아래는 브라우저를 쳐서 호출이 오는 코드입니다.

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);

        // some other code
    }

문제 설명:-

이제 어떤 방법이 있습니까? 일부 헤더에서 IP 주소를 추출 할 수 있습니까? 즉, 어떤 IP 주소에서 전화가 오는지 알고 싶습니다. 즉, URL 위의 전화를 거는 사람이 누구든지 해당 IP 주소를 알아야합니다. 이것이 가능합니까?


해결책은

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc, HttpServletRequest request) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);
        System.out.println(request.getRemoteAddr());
        // some other code
    }

HttpServletRequest request메서드 정의에 추가 한 다음 Servlet API를 사용합니다.

여기에 봄 문서가 말했다

15.3.2.3 지원되는 핸들러 메서드 인수 및 반환 유형

Handler methods that are annotated with @RequestMapping can have very flexible signatures.
Most of them can be used in arbitrary order (see below for more details).

Request or response objects (Servlet API). Choose any specific request or response type,
for example ServletRequest or HttpServletRequest

나는 여기에 늦었지만 이것은 누군가가 답을 찾는 데 도움이 될 수 있습니다. 일반적으로 servletRequest.getRemoteAddr()작동합니다.

대부분의 경우 애플리케이션 사용자가 프록시 서버를 통해 웹 서버에 액세스하거나 애플리케이션이로드 밸런서 뒤에있을 수 있습니다.

따라서 사용자의 IP 주소를 얻으려면 이러한 경우 X-Forwarded-For http 헤더에 액세스해야 합니다.

예 : String ipAddress = request.getHeader("X-FORWARDED-FOR");

도움이 되었기를 바랍니다.


나는 이것을하기 위해 그런 방법을 사용한다

public class HttpReqRespUtils {

private static final String[] IP_HEADER_CANDIDATES = {
        "X-Forwarded-For",
        "Proxy-Client-IP",
        "WL-Proxy-Client-IP",
        "HTTP_X_FORWARDED_FOR",
        "HTTP_X_FORWARDED",
        "HTTP_X_CLUSTER_CLIENT_IP",
        "HTTP_CLIENT_IP",
        "HTTP_FORWARDED_FOR",
        "HTTP_FORWARDED",
        "HTTP_VIA",
        "REMOTE_ADDR"};

public static String getClientIpAddressIfServletRequestExist() {

    if (RequestContextHolder.getRequestAttributes() == null) {
        return "0.0.0.0";
    }

    HttpServletRequest request = ((ServletRequestAttributes)    RequestContextHolder.getRequestAttributes()).getRequest();
    for (String header : IP_HEADER_CANDIDATES) {
        String ipList = request.getHeader(header);
        if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) {
            String ip = ipList.split(",")[0];
            return ip;
        }
    }

    return request.getRemoteAddr();
 }

}


RequestContextHolder아래와 같이 IP 주소를 정적으로 얻을 수 있습니다 .

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
        .getRequest();

String ip = request.getRemoteAddr();

다음은 클래스에 autowired요청 빈이 있는 Spring 방식입니다 @Controller.

@Autowired 
private HttpServletRequest request;

System.out.println(request.getRemoteHost());

이 메소드를 BaseController에 넣으십시오.

@SuppressWarnings("ConstantConditions")
protected String fetchClientIpAddr() {
    HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest();
    String ip = Optional.ofNullable(request.getHeader("X-FORWARDED-FOR")).orElse(request.getRemoteAddr());
    if (ip.equals("0:0:0:0:0:0:0:1")) ip = "127.0.0.1";
    Assert.isTrue(ip.chars().filter($ -> $ == '.').count() == 3, "Illegal IP: " + ip);
    return ip;
}

참고 URL : https://stackoverflow.com/questions/22877350/how-to-extract-ip-address-in-spring-mvc-controller-get-call

반응형