【问题标题】:Alfresco Update File - ERROR POSTAlfresco 更新文件 - 错误发布
【发布时间】:2016-01-24 11:20:52
【问题描述】:

我正在尝试更新 Alfresco 中的文件...我编写了以下代码:

var csrf_header = Alfresco.util.CSRFPolicy.getHeader();
var csrf_token = Alfresco.util.CSRFPolicy.getToken();
function getResponse(pdfbase64) {
                var fd = new FormData();
                if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled())
                {
                    fd.append(csrf_header, csrf_token);
                }
                fd.append("username", "admin");
                fd.append("updatenoderef", nodeRef);
                fd.append("filedata", pdfbase64);
                fd.append("majorversion", "true");
                fd.append("overwrite", "true");
                alert(fileUpdateURL);
                $.ajax({
                  url: fileUpdateURL,
                  type: "POST",
                  data: fd,
                  processData: false,  // tell jQuery not to process the data
                  contentType: false   // tell jQuery not to set contentType
                });

}

变量pdfbase64 是要放在文件上的内容(我对文件所做的更改以更新base64 中的文件),但也许这不是正确的格式?nodeRef 是参考像这样的文件:"workspace://SpacesStore/4fb1b7e7-2502-4011-8870-17e8d626b93b"fileUpdateURLURLPOSThttp://localhost:8080/share/proxy/alfresco/api/upload

Source of params

我得到了错误:

发布http://localhost:8080/share/proxy/alfresco/api/upload 500 内部服务器错误

javax.servlet.ServletException: 可能的 CSRF 攻击记录时 比较会话中的令牌和请求参数。请求:POST /share/proxy/alfresco/api/上传到 org.alfresco.web.site.servlet.CSRFFilter$AssertTokenAction.run(CSRFFilter.java:845) 在 org.alfresco.web.site.servlet.CSRFFilter.doFilter(CSRFFilter.java:312) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241 ) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.SSOAuthenticationFilter.doFilter(SSOAuthenticationFilter.java:447)

在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241 ) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:74) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241 ) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

编辑: 如果我使用

http://localhost:8080/alfresco/service/api/upload

而不是

http://localhost:8080/share/proxy/alfresco/api/upload

我得到错误:

{
    "status" : 
  {
    "code" : 400,
    "name" : "Bad Request",
    "description" : "Request sent by the client was syntactically incorrect."
  },  

  "message" : "Required parameters are missing",  
  "exception" : "",

  "callstack" : 
  [ 

  ],

  "server" : "Community v5.0.0 (d r99759-b2) schema 8,022",
  "time" : "Jan 24, 2016 1:14:41 PM"
}

谁能帮帮我?

编辑2:

我尝试使用 http://localhost:8080/share/proxy/alfresco/api/upload 提出请求:

function getResponse(pdfbase64) {
            var csrf_header = Alfresco.util.CSRFPolicy.getHeader();
            var csrf_token = Alfresco.util.CSRFPolicy.getToken();
            var fd = new FormData();
            if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled())
            {
                fd.append(csrf_header, csrf_token);
                fileUpdateURL += "?" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken());

            }
            fd.append("username", "admin");
            fd.append("updatenoderef", nodeRef);
            fd.append("filedata", pdfbase64);
            fd.append("majorversion", "true");
            fd.append("overwrite", "true");
            alert(fileUpdateURL);
            $.ajax({
                url: fileUpdateURL,
                type: "POST",
                data: fd,
                processData: false,  // tell jQuery not to process the data
                contentType: false   // tell jQuery not to set contentType
            });

    }

但我得到错误:

{
        "status" : 
      {
        "code" : 400,
        "name" : "Bad Request",
        "description" : "Request sent by the client was syntactically incorrect."
      },  

      "message" : "Required parameters are missing",  
      "exception" : "",

      "callstack" : 
      [ 

      ],

      "server" : "Community v5.0.0 (d r99759-b2) schema 8,022",
      "time" : "Jan 24, 2016 1:14:41 PM"
    }

【问题讨论】:

  • ajax 调用是否在“露天共享”页面中执行?当前页面的url是什么?
  • 是的。 localhost:8080/share/page/hdp/ws/my-page?...
  • @PRVS 你想达到什么目的?您是否尝试从 Aikau 页面上传文档?你真的需要 CSRF 吗?
  • 是的。我不知道我是否需要,但我有上面三个选项,我尝试过,还有错误。
  • 爱考有什么影响?

标签: javascript jquery ajax alfresco alfresco-share


【解决方案1】:

尝试在你的函数中移动这些行:

var csrf_header = Alfresco.util.CSRFPolicy.getHeader();
var csrf_token = Alfresco.util.CSRFPolicy.getToken();

如果这不能解决您的问题并且问题不是csrf_* vars 的变量范围问题,那么您应该尝试来自here 的提示(2)


更新: 正如我在聊天中解释的那样,您应该替换:

fd.append("filedata", pdfbase64);

与:

fd.append("filedata", new Blob([pdfbase64], {type: 'application/pdf'}););

【讨论】:

  • 我使用了这个并且 POST 被发送到:localhost:8080/share/proxy/alfresco/api/… 但这不起作用。提示是if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled()) { fd.append(csrf_header, csrf_token); fileUpdateURL += "?" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken()); } 对吗?没有解决问题:(
  • 哦 @YReg: ,但错误不同...{ "status" : { "code" : 400, "name" : "Bad Request", "description" : "Request sent by the client was syntactically incorrect." }, "message" : "Required parameters are missing", "exception" : "", "callstack" : [ ], "server" : "Community v5.0.0 (d r99759-b2) schema 8,022", "time" : "Jan 24, 2016 2:32:26 PM" }
【解决方案2】:

不用设置标头,而是在 url 上传递令牌:

if (Alfresco.util.CSRFPolicy && Alfresco.util.CSRFPolicy.isFilterEnabled())
{
   url += "?" + Alfresco.util.CSRFPolicy.getParameter() + "=" + encodeURIComponent(Alfresco.util.CSRFPolicy.getToken());
}

CSRF Policy中所述

通过提交带有 enctype 的表单上传文件时 multipart/form-data 无法在请求上设置标头, 原因不是特别是因为 enctype 而是由于 事实上,它不可能在任何表单提交上设置标题 浏览器。

另一种解决方案是使用处理所有事情的 Alfresco.forms.Form。

【讨论】:

  • 我在上面做了这个,但我得到了错误 400。请参阅我的第三个答案示例。这是我做的。
  • 400 可能意味着 url 不正确。试着把它写在控制台上。这可能只是一个错字...
  • 其实...最简单的故障排除方法是使用 chrome 或 firefox 中的开发工具。所以你会确切地看到被调用的 url。使用 F12 打开开发工具,然后打开“网络”选项卡。
  • "status" : { "code" : 400, "name" : "Bad Request", "description" : "客户端发送的请求在语法上不正确。" }, "message" : "缺少必需的参数", "exception" : "",
  • 我认为问题在于您正在使用“追加”将参数添加到 url,但是您使用的问号只能在查询字符串的开头使用。
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多