보통은 lo_application->get_remote_address( ) 로 접속한 아이피를 알 수 있지만

여러 AP가 있는 환경에서는 로드밸런싱 장비가 중간에 있어서 그 장비 아이피가 나오는 경우가 있습니다.

그래서 그런 경우에도 원래 접속자의 IP를 알 수 있도록 펑션을 만들어 보았습니다.

웹딘에서도 되고 SAP GUI에서도 동작하도록  IF-ELSE 로 SAP GUI용 로직도 넣었습니다.

접속 로그 남기는데 활용하세요.

 

FUNCTION zget_ip_address.
*"---------------------------------------------------------------------- *"
*"Local interface:
*"  EXPORTING
*"     REFERENCE(EV_IP) TYPE  CSEQUENCE
*"----------------------------------------------------------------------
    DATA: lo_application   TYPE REF TO if_wd_application,
          ls_header_fields TYPE wdr_name_value,
          lv_ip            TYPE string.

    IF wdr_task=>application_name IS INITIAL.
      " SAP GUI
      CALL METHOD cl_gui_frontend_services=>get_ip_address
        RECEIVING
          ip_address           = lv_ip
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
    ELSE.
      " WD
      READ TABLE wdr_task=>client_window->if_wdr_client_info_object~header_fields INTO ls_header_fields
            WITH KEY name = 'x-forwarded-for'.
      IF sy-subrc = 0.
        " load balancer 통해서 접속한 경우.
        lv_ip = ls_header_fields-value.
      ELSE.
        " 직접 AP 로 접속한 경우.
        lo_application = wdr_task=>application->get_api( ).
        lv_ip = lo_application->get_remote_address( ).
      ENDIF.

    ENDIF.

    ev_ip = lv_ip.
ENDFUNCTION.

 

 

+ Recent posts