2012-08-24 2 views
8

웹 응용 프로그램이있어서 그 웹 응용 프로그램에 가장 많이 액세스하는 영역을 알 수 있도록 내 웹 사이트에 액세스하는 클라이언트의 IP 주소를 캡처하고 싶습니다. 내 응용 프로그램에 Java EE을 사용하고 있습니다.내 웹 사이트에 어떤 IP 주소로 액세스했는지 확인하는 방법은 무엇입니까?

아마도 헤더에 대해 이야기하고 최종 사용자로부터 request이 전송되면 어떤 해결책이있을 것입니다. 인터페이스 ServletRequest 또는 방법 getHeaders() 형태의 인터페이스 HttpServletRequest에서

+0

보통 호스팅 회사에서 이러한 기능을 제공합니다. – adarshr

+2

선택한 서블릿 컨테이너가 모든 클라이언트 액세스를 기록합니다. 프로그래밍 방식으로 IP를 가져 오려면 [ServletRequest.getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29)를 사용하십시오. –

+0

안녕하세요, API 메소드가 재미있어 보였습니다. 실제로 jsp 페이지에서 요청이 전송되는 내 서블릿에서이를 사용했습니다. 그러나 여전히 어떤 가치도 보이지 않습니다. 이 목적으로 request.getParameter 메서드()를 사용해야합니까, 그렇다면 어떻게합니까? – Prateek

답변

15

사용 방법 getRemoteAddr() :

한주의는 방법 getRemoteAddr 사용하기위한있다
HttpServletRequest httpRequest = (HttpServletRequest) request; 
String userIpAddress = httpRequest.getHeader("X-Forwarded-For"); 

:

은 확실히 당신이 방법을 사용할 수 있으며, 일반적인 경우에 당신이 얻을 것이다 클라이언트의 IP. 그러나 사용자가 프록시를 사용하는 경우이 방법은 쓸모가 없습니다. 이 경우 클라이언트가 아닌 프록시 서버의 IP 주소를 받게됩니다. 그러나 프록시는 요청하는 클라이언트 IP를 특별한 HTTP 헤더에 포함시킬 수 있습니다. 따라서 실제 클라이언트 IP 호출 방법 getHeader("X-Forwarded-For")을 검색하십시오.

JSP에서 사용 예 : JSTL를 사용하여 세션에서 IP 주소의

를 사용하여 설정 값 :

<c:set var="userIp" value="${requestScope.header('x-forwarded-for')}" scope="session" /> 

그리고이 편리한 장소에 세션에서이 값을 얻는다. 클라이언트의 인터넷 프로토콜 (IP) 주소를 반환

java.lang.String의 getRemoteAddr을() : session.getAttribute('userIp');

docs을 읽어 보시기 바랍니다으로

JSP에서는 <c:out value="${sessionScope.userIp}" /> 나 서블릿에서 사용할 수 있습니다 또는 마지막 프록시은 요청을 보냈습니다.

+0

올바른 방향을 알려 주셔서 감사합니다. 하지만 여기에있는 수정은 폼과 submit 버튼을 가지고있는 jsp에서이 메소드를 사용할 위치입니다. 또는 최종 서블릿 내부에서 실제로 실행되고 데이터를 데이터베이스에 제출합니다. – Prateek

+0

'요청'에 액세스 할 수 있어야합니다. [JSTL] (http://www.oracle.com/technetwork/java/index-jsp-135995.html)을 사용하여 세션에서 IP 주소의 설정 값을 사용하십시오. ' 그리고이 가치를 편리한 장소에서 세션에서 얻으십시오. JSP에서는''또는'session.getAttribute ('userIp');'로 서블릿에 있습니다. – kapand

+0

이 방법을 사용하면 데이터베이스에서 출력이 'null /'이됩니다. 반면에 getRemoteAddr()의 경우 데이터베이스 출력은'0 : 0 : 0 : 0 : 0 : 1/:'이됩니다. – Prateek

0

요청 객체는 JSP에서 생성 된 서블릿 메소드에 Java 인수로 전달됩니다. 그 논쟁의 이름은 ... 기다려 ... request.

그래서 JSP에 내장 된 스크립틀릿에서이를 참조 할 수 있어야합니다. 예 :

<% 
     InetAddress addr = request.getRemoteAddr(); 
     // blah blah blah 
    %> 

JSP에서 이러한 종류의 작업을 수행해야하는지 여부는 논쟁의 여지가 있습니다. 일반적으로 JSP는 만 출력 형식 지정에 사용해야하는 "모범 사례"로 받아 들여집니다. 웹 애플리케이션의 비즈니스 로직은 컨트롤러 서블릿에 있어야하며, 그런 다음 JSP 서블릿으로 전달되어 HTML (또는 무엇이든)을 생성해야합니다.

비즈니스 로직을 JSP에 넣으려면 스크립트 릿릿을 유지하기가 어려워지는 경향이 있습니다. 인 경우의 경우 걱정할 필요가 없습니다. 엔지니어링 측면에서 선호되는 접근법은 태그와 JSP 표현 언어를 사용하는 것입니다.)

마지막으로 getRemoteAddr()에 의해 반환 된 IP 주소가 실제 클라이언트 IP 주소가 될 것이라고 보장 할 수 없습니다. 프록시의 주소 일 수도 있고 심지어는 완전한 제조 일 수도 있습니다.

+1

먼저 [getRemoteAddr()] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) 메소드는 [ServletRequest] (http : //docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29) 요청을 [HttpServletRequest] (http : // docs. oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html). 게다가,이 메소드는 사용자 IP 주소를 반환하지 않을 수도 있습니다. 셋째, 스크립틀릿은 나쁜 습관입니다. – kapand

+0

MVC를 알고 있지만 위의 스크립트를 사용하면 어떻게 든 숨겨진 매개 변수를 사용하여 IP 주소를 얻지 못하는 것으로 해결할 수 있습니다. 요청 객체로 매개 변수를 전달하려면 <%%> 스크립트를 사용해야합니다. 그러나 이것은 오류를주고 있습니다. 이것을 데이터를 보내는 것과 같은 형식으로 배치해야합니까? – Prateek

+0

순수한 JSP 만 사용하는 경우에는 스크립틀릿을 사용하여 문제를 해결할 수 있습니다 :'<% // your java code %>'. JSP가 서블릿으로 변형되었다는 사실. 따라서이 코드는 같은 방식으로 작동합니다. 이것은 작은 테스트 프로젝트를위한 수용 가능한 솔루션이지만, 개발 및 성장할 것이라면 그러한 코드는 이해하고 유지하기가 불편할 것입니다. – kapand

1

위와 마찬가지로 대답 (안드레이와 스티븐)은 analytics 도구를 사용합니다. 그것은 당신에게 귀하의 웹 사이트에 오는 트래픽의 큰 그림을 줄 것이다. 그러한 예가 Google Analytics입니다.

+0

Google Analytics 계정이 있습니다. 그러나 응용 프로그램 내에서 고유 한 IP 조회수를 기반으로 그래프를 그려 봅니다. Google Analytics는 도움이되지 않습니다. – Prateek

+0

@pKs : 동의합니다. 귀하의 응용 프로그램 내에서 그것을 소비하려는 경우 u는 분석을 사용할 수 없습니다. – pratikabu

관련 문제