使用Ajax调用在Exist-DB中创建数据库条目

时间:2018-09-02 15:13:24

标签: ajax xquery exist-db

在开发一个独立的exist-db应用程序时,我在ajax调用期间传递用户身份时遇到了一些问题。

我创建了一个标准页面,该页面允许用户使用他或她的标准exist-db帐户登录。 (或多或少基于此https://github.com/eXist-db/existdb-login)。

在某些时候,用户需要创建自己的条目并上传文件,这是通过ajax脚本完成的(我使用的是Kartik的bootstrap uploader,但它基本上是标准的ajax上传功能):

$('#input-24').fileinput({

        uploadUrl: "../modules/uploader.xql",
        uploadAsync: true,

        fileActionSettings : {
            uploadExtraData() {

                return {
                    'FileName': $(this).data('title'),

                }
            }
        },
    });  

现在,这当然会失败,因为看起来就像GUEST用户正在尝试创建条目,此操作仅允许注册用户使用。

existent-db是否允许在这种情况下发送我的登录凭据,而不必诉诸标准的HTTP登录(这是有问题的,因为这意味着创建一个cookie来存储密码,这或多或少会呈现该密码)。整个登录诉讼都存在无用的机制),还是有什么方法可以使用控制器代替外部脚本?

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为您可以将用户名和密码添加到URI中,以触发Ajax客户端进行基本操作。例如http://username:password@your-server/some/uri/modules/uploader.xql

答案 1 :(得分:0)

对于简单的基本身份验证,我们执行以下操作,因为页面本身是由xQuery提供服务的。

步骤1:我们在页面xQuery中创建一个包含会话信息的变量。这对您来说应该没问题……您的登录结果将是一个HTML页面:

let $sessinfo := util:base64-encode(concat(request:get-parameter('user', ()), ":", request:get-parameter('pass', ())))

步骤2:在xQuery中构建结果页面的过程中,我们通过放置在标记中的简单script命令将其转换为javascript变量:

<script>
    var sessinfo = "{$sessinfo}";
</script>

第3步:在载入页面的Javascript中(我们使用jQuery),在页面准备就绪后,我们为所有AJAX请求设置身份验证:

jQuery.ajaxSetup({
  headers: {
    "Authorization": "Basic " + sessinfo
  }
});

此后,发出的任何AJAX请求都将带有用户名和密码的基本身份验证标头发送到其他用jQuery.ajax执行的xQueries中。

答案 2 :(得分:0)

要使eXistdb会话与XHR(Ajax请求)一起使用,您需要确保

login:set-user('my.login.domain', (), false())

在控制器中调用之前,将其转发到请求处理程序。否则,所有请求似乎都来自“来宾”用户。

如果您想使用原始/原生JavaScript请求,例如fetch您还需要告诉它向请求添加凭据:

fetch(url, { credentials: 'same-origin', method: 'GET' })

顺便说一句,在exidtb-login中使用的持久登录可能使用cookie值来获取存储在服务器上的会话变量(JSESSIONID),但我需要检查一下。