在ODATA操作读取数据时,可以在代码中可通过类/IWFND/CL_TRANSACTION_HANDLER得到前端客户的一些信息,比如客户的浏览器,IP,操作系统 ,完整URL参数,COOKIE,XSRF_TOKEN等信息。
以下代码是我在做define root custom CDS时,写在其中的读取类ZCL_CONSIGN_SALE_QUERY中的,此CDS的开发可参看使用RAP创建创建一个简单功能例子
1.读取客户端信息
可读取IE,IP等客户信息,但COOKE在这里不会显示 ,后面可用其它方法读取
1 2 3 4 5 6 |
DATA: LO_TRANSACTION_HANDLER TYPE REF TO /IWFND/CL_TRANSACTION_HANDLER, LT_TIHTTPNVP TYPE TIHTTPNVP. LO_TRANSACTION_HANDLER = /IWFND/CL_TRANSACTION_HANDLER=>GET_TRANSACTION_HANDLER( ). LT_TIHTTPNVP = LO_TRANSACTION_HANDLER->GET_ALL_REQUEST_PARAMS( ). |
其中LT_TIHTTPNVP中就有前端用户操作的各种数据,比如其中NAME= ‘referer’时的值 ,就是用户操作时的完整URL信息,这样可以把一些用户参数放到URL中,在ODATA读取时得到。
还能得到前端用户的一些其它信息,比如IP,浏览器,sap-passport等信息,
1 2 3 4 5 6 7 8 9 |
DATA: LO_PROCESSOR TYPE REF TO /IWFND/CL_SODATA_PROCESSOR, LO_LOG TYPE REF TO /IWFND/CL_LOGGER, LO_RUNTIME TYPE REF TO /IWFND/CL_SUTIL_RUNTIME, * LO_HTTP_SERVER TYPE REF TO CL_HTTP_SERVER_NET, LT_COOKIE TYPE TIHTTPCKI. LO_LOG = /IWFND/CL_LOGGER=>GET_LOGGER( ). LO_RUNTIME = /IWFND/CL_SUTIL_RUNTIME=>GET_INSTANCE( ). |
上面的类LOG,RUTIME,还也可以读取到一些WEB相关的信息,可以调试查看。
2.得到XSRF_TOKEN
可以使用以下类得到XSRF_TOKEN,正常SAP配置都是启用了些值的,这是SAP WEB操作的安全标识,只要在前端通过用户密码登陆时,都会生成一个唯一的值 ,并且直到退出前此值不会改变,这样就可以此值来作为用户此次登陆操作的唯一ID,但这个不是COOKIE
1 2 3 4 5 6 7 |
*得到XSRF_TOKEN TRY. DATA(L_XSRF_TOKEN) = CL_HTTP_SECURITY_SESSION_ADMIN=>GET_CURRENT_SESSION_CONTEXT( ). CATCH CX_HTTP_SECURITY_SESSION_ADMIN. DATA(L_ERROR) = '运用在SICF中设置了自动登陆,不能猎取TOKEN'. ENDTRY. * |
3.获取COOKIE
在前端IE打开SAP时,比如FIORI 打开时,输入用户密码登陆后,对所有的功能操作在IE端发送到SAP的URL中都会带着COOKE,此值直到退前,都不会改变,此值也是此次用户登陆的唯一标识。
此值是从类属性CL_HTTP_SERVER->m_security_session_cookie中读取,但此属性是一个私有属性,所以继承了此类来读取。另外传入的是CL_HTTP_SERVER_NET,此类也有些值 。
先创建继承子类ZCL_HTTP_SERVER_NET,我是在SE24中创建的,应该也可以在使用的地方创建。
任何问题请联系yan252@163.com
在我的的代码中读取COOKIE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATA: LO_HTTP_SERVER_NET TYPE REF TO IF_HTTP_SERVER, LR_HTTP_SERVER_NET TYPE REF TO CL_HTTP_SERVER_NET . CALL FUNCTION 'HTTP_GET_CURRENT_SERVER_CB' IMPORTING SERVER_CB = LO_HTTP_SERVER_NET EXCEPTIONS NO_ICF_SESSION = 1 OTHERS = 2. LR_HTTP_SERVER_NET ?= LO_HTTP_SERVER_NET. DATA(L_SECURITY_SESSION_COOKIE) = ZCL_HTTP_SERVER_NET=>GET_SECURITY_SESSION_COOKIE( LR_HTTP_SERVER_NET ). |
以上的XSRF_TOKEN,COOKIE,都能代表此次用户登陆操作的唯一性,但如果用户在SICF中对运行设置了默认登陆用户密码的话,此两值 都是空的,读取不到值,另外在代码中 DATA(L_SESSID) = CL_HTTP_SERVER_NET=>IF_HTTP_SERVER~SESSION_ID.还能读到个一个SESSION的值 ,但发现此值每次刷新都会变,这个值没有唯一性,