2010-04-23 5 views
2

JSR168 포틀릿에서 클라이언트의 IP (요청)를 얻으려면 어떻게해야합니까?JSR168 포틀릿에서 클라이언트 IP를 얻으려면 어떻게해야합니까?

내가하는 Liferay 5.2.3에있어

내가하는 Liferay 내부 기능으로 IP를 얻을 수 있습니다 :이 작업을 수행하는 모든 포털에 의존하지 않는 방법이

String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr(); 

있습니까?

+0

JSR-ish 방법을 찾았습니까? –

+0

@ Alexandru : 아니,이 방법을 사용할 수 없다고 생각합니다. "JSR168 준수" –

답변

1

포틀릿에서 Spring MVC를 사용하면 같은 서블릿 요청에 액세스하여 클라이언트 IP를 얻을 수 있습니다. 코드를 편리하게 사용할 수는 없지만 컨트롤러 클래스에 ActionRequest 또는 HTTPservlet 요청을 사용하면됩니다. 그것은 비 Liferay 방식으로 당신을 위해 그것을 얻어야합니다.

-1

죄송합니다. 여기에 귀하의 질문에 답변하지는 않겠지 만 그 IP 주소를 얻지 않으려는 몇 가지 이유를 추가하십시오. 일부 설정의 경우 한 클라이언트의 요청이 여러 IP 주소를 통해 발생합니다.로드 밸런서 뒤에 있거나 외부 IP 주소가 다른 연결을 번들로 제공하거나 프록시 팜 뒤에 숨어있을 수 있습니다. 다른 주소로.

또한 프록시 또는 NAT가 관련된 경우 동일한 IP 주소에서 여러 클라이언트를 얻을 수 있습니다.

그 외 : 인증을 위해 클라이언트 주소를 사용하는 경우 각별한주의를 기울여야합니다. 하나의 클라이언트에 여러 개의 주소가 필요하거나 한 주소에서 여러 개의 클라이언트가 필요할 수 있습니다. 또한 동일한 주소에서 여러 개의 클라이언트를 가질 수 있습니다. 클라이언트 주소와 관련하여 많은 위험한 가정을 보았습니다.

주의하십시오!

1
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); 
관련 문제