web-dev-qa-db-ja.com

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アドレスを知る必要があります。これは可能ですか?

63
john

解決策は

@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をメソッド定義に追加してから、サーブレットAPIを使用します

Springドキュメント ここ で述べた

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
105
Koitoer

私はここに遅れていますが、これは答えを探している人を助けるかもしれません。通常、servletRequest.getRemoteAddr()は機能します。

多くの場合、アプリケーションユーザーがプロキシサーバーを介してWebサーバーにアクセスしている場合や、アプリケーションがロードバランサーの背後にある場合があります。

そのため、このような場合に X-Forwarded-For httpヘッダーにアクセスして、ユーザーのIPアドレスを取得する必要があります。

例えばString ipAddress = request.getHeader("X-FORWARDED-FOR");

お役に立てれば。

93
sunitkatkar

私はこれを行うためにそのような方法を使用します

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

}

7
panser

以下のようにRequestContextHolderからIPアドレスを静的に取得できます。

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

String ip = request.getRemoteAddr();
7
Radouane ROUFID

以下は、@ControllerクラスのautowiredリクエストBeanを使用したSpringの方法です。

@Autowired 
private HttpServletRequest request;

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

このメソッドを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;
}
0
BaiJiFeiLong