JSR168ポートレットでクライアント(要求)のIPを取得するにはどうすればよいですか?
私はLiferay5.2.3を使用しています
Liferayの内部機能を備えたIPを取得できます。
String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr();
これを行うためのポータルニュートラルな方法はありますか?
JSR168ポートレットでクライアント(要求)のIPを取得するにはどうすればよいですか?
私はLiferay5.2.3を使用しています
Liferayの内部機能を備えたIPを取得できます。
String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr();
これを行うためのポータルニュートラルな方法はありますか?
ええと、1つの方法...ポートレットでSpring MVCを使用する場合、同じサーブレットリクエストにアクセスでき、クライアントIPを取得できます。コードは手元にありませんが、コントローラークラスに追加する場合は、ActionRequestまたはHTTPservletリクエストを使用してください。それはLiferay以外の方法であなたのためにそれを得るはずです。
java.lang.reflect.Field f = request.getClass().getDeclaredField("_request ");
f.setAccessible(true) ;//make visiable
HttpServletRequest httpServletRequest = (HttpServletRequest) f.get(request); get Request
String ip = httpServletRequest.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = httpServletRequest.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = httpServletRequest.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = httpServletRequest.getRemoteAddr();
}
System.out.println("ip:="+ip);
申し訳ありませんが、ここではあなたの質問に答えるつもりはありませんが、そのIPアドレスを取得したくない理由をいくつか追加してください。一部の設定では、1つのクライアントからのリクエストが複数のIPアドレスを介して送信されるのが一般的です。ロードバランサーの背後にあるか、異なる外部IPアドレスを持ついくつかの接続をバンドルするか、各プロキシが送信されるプロキシファームの背後に隠れている可能性があります。異なるアドレスで。
また、プロキシまたはNATが関係している場合、同じIPアドレスから複数のクライアントを取得する可能性があります。
そのため:認証目的でクライアントアドレスを使用する場合は、細心の注意を払ってください。1つのクライアントに複数のアドレスが必要な場合や、1つのアドレスに複数のクライアントがある場合があります。また、(同じ)複数のアドレスから複数のクライアントを持つことができます。私はクライアントのアドレスに関して多くの危険な仮定を見てきました。
気をつけて!