是否可以使用Cookie登录B1 ServiceLayer

2020-09-14 18:47发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在尝试创建一个HTML5应用程序,该应用程序在重新加载页面后将保持登录到ServiceLayer会话中。

如果我使用邮递员登录服务层,则会得到以下标题详细信息:

连接→保持活动
 内容编码→gzip
 内容长度→174
 内容类型→application/json; odata =最小元数据; charset = utf-8
 DataServiceVersion→3.0
 日期→2018年8月16日,星期四06:10:06 GMT
 保持活动→超时= 15,最大= 100
 服务器→Apache
 Set-Cookie→B1SESSION = 0669e842-a11b-11e8-8000-000c29594cad; HttpOnly;
 Set-Cookie→HASH_B1SESSION = 4548D83BAFE012C7E2BA5E30A504D30B19CEC467;  HttpOnly
 变化→接受编码
 

我尝试访问JS应用程序内部的Set-Cookie无济于事。

我在JS应用程序中的登录如下:

 $ .ajax({
 网址:serviceLayerLoginURL,
 xhrFields:{
 withCredentials:正确
 },
 数据:jData = JSON.stringify({
 用户名:用户,
 密码:pass,
 CompanyDB:comp
 }),
 输入:" POST",
 dataType:" json",
 成功:功能(r,状态,xhr){
 app.SessionId = r.SessionId;
 app.to(" tilesPage");
 sap.ui.core.BusyIndi​​cator.hide();
 },
 错误:this.onErrorCall
 });
 

现在我的问题是:如何访问正确的信息,以及如何使用它们在没有用户名,密码和可选的CompanyDB的情况下登录?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在尝试创建一个HTML5应用程序,该应用程序在重新加载页面后将保持登录到ServiceLayer会话中。

如果我使用邮递员登录服务层,则会得到以下标题详细信息:

连接→保持活动
 内容编码→gzip
 内容长度→174
 内容类型→application/json; odata =最小元数据; charset = utf-8
 DataServiceVersion→3.0
 日期→2018年8月16日,星期四06:10:06 GMT
 保持活动→超时= 15,最大= 100
 服务器→Apache
 Set-Cookie→B1SESSION = 0669e842-a11b-11e8-8000-000c29594cad; HttpOnly;
 Set-Cookie→HASH_B1SESSION = 4548D83BAFE012C7E2BA5E30A504D30B19CEC467;  HttpOnly
 变化→接受编码
 

我尝试访问JS应用程序内部的Set-Cookie无济于事。

我在JS应用程序中的登录如下:

 $ .ajax({
 网址:serviceLayerLoginURL,
 xhrFields:{
 withCredentials:正确
 },
 数据:jData = JSON.stringify({
 用户名:用户,
 密码:pass,
 CompanyDB:comp
 }),
 输入:" POST",
 dataType:" json",
 成功:功能(r,状态,xhr){
 app.SessionId = r.SessionId;
 app.to(" tilesPage");
 sap.ui.core.BusyIndi​​cator.hide();
 },
 错误:this.onErrorCall
 });
 

现在我的问题是:如何访问正确的信息,以及如何使用它们在没有用户名,密码和可选的CompanyDB的情况下登录?

付费偷看设置
发送
4条回答
梦想连接
1楼 · 2020-09-14 19:06.采纳回答

Manuel,

可能是我误解了您,但它已经按照您的描述进行了。 唯一的区别是您需要使用B1SESSION和ROUTEID cookie,而不是凭据。

因此,当用户刷新页面时,您仍然可以使用相同的cookie来执行您的操作。 该cookie有效,直到您使用相同的B1SESSIONID发布到注销资源。

实际上,我什至不确定您是否需要照顾cookie。 如果是网络解决方案,则浏览器将为您做所有事情(当然,如果未关闭Cookie)。 您无需从响应中获取sessionID(此行app.SessionId = r.SessionId;)。 据我了解,这仅供参考。 服务器返回cookie,浏览器将其存储并添加到您的其他请求中。

因此,即使关闭并重新打开浏览器,这两个测试功能也对我来说很好:

功能LoginClick()
 {
 $ .ajax({
 url:URL +"登录",
 xhrFields:{
 withCredentials:正确
 },
 数据:jData = JSON.stringify({
 用户名:用户,
 密码:pass,
 CompanyDB:comp
 }),
 输入:" POST",
 dataType:" json",
 成功:功能(r,状态,xhr){
 警报("成功");
 }
 });
 }


 函数CallClick()
 {
 $ .ajax({
 url:URL +"项目",
 xhrFields:{
 withCredentials:正确
 },
 类型:" GET",
 dataType:" json",
 成功:功能(r,状态,xhr){
 警报("成功");
 }
 });
 }
 

因此,如果我调用LoginClick(),请关闭浏览器,将其重新打开,然后调用CallClick(),它将正常工作。 如果我从SL URL中清除了cookie,我将被重定向到标准的Chrome登录表单。

能不能别闹
2楼-- · 2020-09-14 18:55

Sergei嗨,

这就是我想要的。

最后一个小时,我想出了另一种再次登录的方法。

我将登录凭据存储为document.cookie,并给了它们一个过期日期。

因此,由于我将登录页面作为起始页面,因此在渲染后询问是否有cookie,只需手动调用登录功能即可。

但是您的解决方案看起来更简单,更好,我将尝试实现您的方式。

非常感谢!

spaceman01
3楼-- · 2020-09-14 18:57

嗨,曼努埃尔,

仅在发布到"登录"资源时需要传递CompanyDB,用户名和密码。 没有凭据就无法登录。

当您致电Login时,将从服务器中返回cookie(B1SESSION和ROUTEID),并且您必须将它们用于任何其他请求(包括Logout)。

逻辑如下:

  1. 使用您的正文请求中的凭据发布到/登录
  2. 服务器返回cookie
  3. 您仅请求使用此cookie的另一个资源(浏览器将自动添加此cookie)
  4. ...
  5. 发布到/登出一个空的正文和您的cookie以关闭会话

以下是ServiceLayer文档中的信息:

登录

使用指定的凭据登录服务层。 通常,这是使用服务层API的第一步。 在没有登录的情况下调用服务层API将导致失败。 成功登录后,HTTP响应正文中将返回一个会话ID。 同时,将设置两个名为" B1SESSION"和" ROUTEID"的HTTP cookie项目。 如果在浏览器中调用服务层API,则无需与它们相关联,因为浏览器将在后续的HTTP请求中将它们自动发送到服务层。 您确实需要在随后的服务层API调用中将它们添加到HTTP标头中。 否则,服务层会将其视为没有登录的错误请求。

Haoba3210
4楼-- · 2020-09-14 19:11

你好Sergei,

感谢您尝试帮助我。

我已经按照您的描述登录并请求其他资源。 我正在寻找的是将xhrCredentials保存一段确定的时间(例如,在``服务层属性''中设置的30分钟),因此在重新加载页面后无需再次输入登录凭据即可登录。

如果无法通过服务层实现此目的,我想我必须编写自己的代码并将用户凭据自己保存在Cookie中?

如果有帮助,我可以描述这种情况,我正在尝试寻找以下解决方案:

用户使用其用户名,密码和CompanyDB登录。

创建B1服务层会话(使用B1SESSION,ROUTEID等)

在这里我想创建一个Cookie

用户在做事情

页面重新加载

现在发生的是用户必须使用用户名,密码和CompanyDB重新登录

我想要的是:如果用户刚刚重新加载的会话不超过30分钟,则他不必再次登录,因为

我会自动向服务层提供Cookie,并让用户继续工作。

一周热门 更多>