如何通过存储库网页脚本以编程方式创建Alfresco网站?

时间:2018-11-08 10:36:13

标签: java alfresco alfresco-share alfresco-webscripts

我已经实现了Alfresco储存库网页脚本(Java),以编程方式创建了新站点。

我注意到有一个SiteService接口,我认为可以用来执行此操作-

SiteInfo site = siteService.createSite("site-dashboard", "mySite", 
"mySite", "", SiteVisibility.PUBLIC);

但是,这导致创建了无法正常运行的网站,尽管在Alfresco Share仪表板中可见,但我无法使用它。

然后,我遇到了this代码示例,该示例正是我想要的。但是该代码包括一个进行身份验证的部分,涉及将用户的登录名和密码详细信息发送到dologin Web服务。真的不想这样做。

但是,由于用户已经通过Alfresco Share登录,因此他们应该已经通过身份验证。

如果我从代码中调用创建站点的Web脚本(如示例中所示,而没有对dologin的初始调用),则会得到401(未经授权)的返回代码。

所以我的问题是,如何将我的身份验证告诉创建网站的脚本? 我读到有关使用身份验证票证here的信息。该票证是否存储在会话中,如果是,那么如何在Java代码中访问它?如果我可以买到票,那么这就足以调用创建站点的脚本。

更新:我已按照注释的建议添加了alf_ticket参数,但仍收到401响应。

我当前的代码是:

    public NodeRef createServiceChange(String serviceChangeName) {

        HttpClient client = new HttpClient();

        String ticket = authService.getCurrentTicket();

        PostMethod createSitePost = new PostMethod("http://localhost:8081/share/service/modules/create-site");

        JSONObject siteObject = new JSONObject();
        try {
            siteObject.put("shortName", serviceChangeName);
            siteObject.put("visiblity", "Public");
            siteObject.put("sitePreset", "site-dashboard");
            siteObject.put("title", serviceChangeName);
            siteObject.put("description", serviceChangeName);
            siteObject.put("alf_ticket", ticket);

            createSitePost.setRequestHeader("Content-Type", "application/json");
            createSitePost.setRequestHeader("Accept", "application/json");
            createSitePost.setRequestEntity(new StringRequestEntity(siteObject.toString(), "application/json", "UTF-8"));

            int status = client.executeMethod(createSitePost);
            System.out.println("create a site script status :: " + status);

            if (status == HttpStatus.SC_OK) {
                System.out.println("Site created OK");
            }
            else{
                System.out.println("There is error in site creation");
            }
        } catch (JSONException err) {
            err.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (HttpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

1 个答案:

答案 0 :(得分:0)

所以我设法以编程方式成功创建了一个网站,这就是我所做的:

首先,忘记编写存储库(平台)Web脚本了。在Alfresco中创建网站是通过调用Share模块完成的,因此您需要实现页面或自定义菜单项来创建网站。我在身份验证方面也遇到了很多问题,但是如果您通过Alfresco Share登录到系统,并在Javascript中使用提供的Alfresco Ajax请求,那么身份验证应该不是问题。

这是我使用的组件:-

  1. 创建共享页面以创建您的网站。在Freemarker模板(.ftl)中,添加一个表单以收集网站详细信息。
  2. 将表单上的按钮附加到以下Javascript函数。请注意,我从网络上的各种代码片段中整理了这些内容,因此可以使用一些清理方法。但这基本上对我有用-

    function create_site()
    {
    var sc_form = document.forms.namedItem('sc_form');
    var name = sc_form.elements.namedItem('name').value;
    
    var url = Alfresco.constants.URL_CONTEXT + "service/modules/create-site";
    
    Alfresco.util.Ajax.request({
    
        method : Alfresco.util.Ajax.POST,
    
        url : url,
    
        dataObj: {
            sitePreset: "site-dashboard",
            visibility: "PUBLIC",
            title: name,
            shortName: name,
            description: name
        },
    
        requestContentType: Alfresco.util.Ajax.JSON,
    
        successCallback: 
        {
            fn: function(res){
               alert("success");
               alert(res.responseText);                                                                                            
            },
    
            scope: this
    
        },
    
        failureCallback: 
        {
           fn: function(response)
           {
              Alfresco.util.PopupManager.displayPrompt(
              {
                 title: Alfresco.util.message("message.failure", this.name),
                 text: "search failed"
              });                                          
           },
           scope: this
        }
    });
    }