私はブラウザから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
をメソッド定義に追加してから、サーブレット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
私はここに遅れていますが、これは答えを探している人を助けるかもしれません。通常、servletRequest.getRemoteAddr()
は機能します。
多くの場合、アプリケーションユーザーがプロキシサーバーを介してWebサーバーにアクセスしている場合や、アプリケーションがロードバランサーの背後にある場合があります。
そのため、このような場合に X-Forwarded-For httpヘッダーにアクセスして、ユーザーのIPアドレスを取得する必要があります。
例えば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();
以下は、@Controller
クラスのautowired
リクエストBeanを使用したSpringの方法です。
@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;
}