접속 로그 관련 IP 받는법좀 알수 있을까요?
- 작성자 :
- 양*혁
- 작성일 :
- 2016-01-26 16:30:06
- 조회수 :
- 1,814
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
Enterprise Business 프로젝트로 개발을 하는데요..
접속로그(LETTNLOGINLOG) 관련 문의 드립니다.
context-syslogaop.xml
에서 밑에와 같이 설정 한후
<bean id="logManage" class="egovframework.let.sym.log.clg.service.EgovLoginLogAspect" />
<aop:config>
<aop:aspect id="logManageAspect" ref="logManage">
<!-- 로그인 Method -->
<aop:before pointcut="execution(public * egovframework.let.uat.uia.web.EgovLoginController.actionMain(..))" method="logLogin" />
<!-- 로그아웃 Method-->
<aop:before pointcut="execution(public * egovframework.let.uat.uia.web.EgovLoginController.actionLogout(..))" method="logLogout" />
</aop:aspect>
</aop:config>
이상태에서
egovframework.let.sym.log.clg.service.logLogin()
매소드에 접근 하게 되는데...
public void logLogin() throws Throwable {
String uniqId = "";
String ip = "";
/* Authenticated */
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
if(isAuthenticated.booleanValue()) {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
uniqId = user.getUniqId();
//uniqId = user.getId();
ip = user.getIp();
}
LoginLog loginLog = new LoginLog();
loginLog.setLoginId(uniqId);
loginLog.setLoginIp(ip);
loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
loginLog.setErrOccrrAt("N");
loginLog.setErrorCode("");
loginLogService.logInsertLoginLog(loginLog);
}
ip 정보가 가지고 오지 않습니다..
참고로
egov-com-servlet.xml
에
<bean id="IpObtainInterceptor" class="egovframework.com.cmm.interceptor.IpObtainInterceptor"/>
<!-- 로그인 체크가 필요한 URL과 로그인 여부를 체크해줄 인터셉터를 등록한다. -->
<bean id="selectAnnotaionMapper"
class="egovframework.rte.ptl.mvc.handler.SimpleUrlAnnotationHandlerMapping" p:order="0">
<property name="interceptors">
<list>
<ref local="authenticInterceptor" />
<ref local="IpObtainInterceptor" />
</list>
</property>
<!-- 로그인 체크가 필요한 URL 리스트 -->
<property name="urls">
<set>
<!-- 전부 관리자만 사용
<value>/people/*/*.do</value>
<value>/EgovPageLink.do</value> -->
</set>
</property>
</bean>
이부분을 추가 했습니다.
접속로그(LETTNLOGINLOG) 관련 문의 드립니다.
context-syslogaop.xml
에서 밑에와 같이 설정 한후
<bean id="logManage" class="egovframework.let.sym.log.clg.service.EgovLoginLogAspect" />
<aop:config>
<aop:aspect id="logManageAspect" ref="logManage">
<!-- 로그인 Method -->
<aop:before pointcut="execution(public * egovframework.let.uat.uia.web.EgovLoginController.actionMain(..))" method="logLogin" />
<!-- 로그아웃 Method-->
<aop:before pointcut="execution(public * egovframework.let.uat.uia.web.EgovLoginController.actionLogout(..))" method="logLogout" />
</aop:aspect>
</aop:config>
이상태에서
egovframework.let.sym.log.clg.service.logLogin()
매소드에 접근 하게 되는데...
public void logLogin() throws Throwable {
String uniqId = "";
String ip = "";
/* Authenticated */
Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
if(isAuthenticated.booleanValue()) {
LoginVO user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
uniqId = user.getUniqId();
//uniqId = user.getId();
ip = user.getIp();
}
LoginLog loginLog = new LoginLog();
loginLog.setLoginId(uniqId);
loginLog.setLoginIp(ip);
loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O
loginLog.setErrOccrrAt("N");
loginLog.setErrorCode("");
loginLogService.logInsertLoginLog(loginLog);
}
ip 정보가 가지고 오지 않습니다..
참고로
egov-com-servlet.xml
에
<bean id="IpObtainInterceptor" class="egovframework.com.cmm.interceptor.IpObtainInterceptor"/>
<!-- 로그인 체크가 필요한 URL과 로그인 여부를 체크해줄 인터셉터를 등록한다. -->
<bean id="selectAnnotaionMapper"
class="egovframework.rte.ptl.mvc.handler.SimpleUrlAnnotationHandlerMapping" p:order="0">
<property name="interceptors">
<list>
<ref local="authenticInterceptor" />
<ref local="IpObtainInterceptor" />
</list>
</property>
<!-- 로그인 체크가 필요한 URL 리스트 -->
<property name="urls">
<set>
<!-- 전부 관리자만 사용
<value>/people/*/*.do</value>
<value>/EgovPageLink.do</value> -->
</set>
</property>
</bean>
이부분을 추가 했습니다.
A
안녕하세요. 표준프레임워크센터입니다.
현재 ip정보가 받지 못하는 이유는 해당 aop 설정을 보시면 Advice시점이 before에 걸려있어서, 로그인 인증 이전에 해당 logLogin() 메소드가 실행이 되기 때문에 ip정보가 들어오지 않습니다.
로그인 인증여부 체크 메소드인 EgovUserDetailsHelper.isAuthenticated();를 로그인 이전에 호출하면 값이 입력되지 않아 "false"값이 return되어 관련정보를 가져올 수 없습니다.
필요에 의해 별도로 IP정보를 가져오시려면 별도 로직을 추가하여 HttpServletRequest를 받아 getRemoteAddr()를 통해 IP를 입력하는 형태로 진행하시면 될 것 같습니다.
아래에 AOP에서 HttpServletRequest를 받아오는 예시를 올려드리니 참조만 하시기 바랍니다.
ex)
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attr.getRequest();
/*EgovClntInfo.getClntIP() : 클라이언트(Client)의 IP주소를 조회하는 유틸 */
ip = EgovClntInfo.getClntIP(request);
감사합니다.
현재 ip정보가 받지 못하는 이유는 해당 aop 설정을 보시면 Advice시점이 before에 걸려있어서, 로그인 인증 이전에 해당 logLogin() 메소드가 실행이 되기 때문에 ip정보가 들어오지 않습니다.
로그인 인증여부 체크 메소드인 EgovUserDetailsHelper.isAuthenticated();를 로그인 이전에 호출하면 값이 입력되지 않아 "false"값이 return되어 관련정보를 가져올 수 없습니다.
필요에 의해 별도로 IP정보를 가져오시려면 별도 로직을 추가하여 HttpServletRequest를 받아 getRemoteAddr()를 통해 IP를 입력하는 형태로 진행하시면 될 것 같습니다.
아래에 AOP에서 HttpServletRequest를 받아오는 예시를 올려드리니 참조만 하시기 바랍니다.
ex)
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attr.getRequest();
/*EgovClntInfo.getClntIP() : 클라이언트(Client)의 IP주소를 조회하는 유틸 */
ip = EgovClntInfo.getClntIP(request);
감사합니다.