如何从存储库 webscript 以编程方式创建 Alfresco 站点?
How do I create an Alfresco site programmatically from a repository webscript?
我已经实现了一个 Alfresco 存储库网络脚本(在 Java 中)以编程方式创建一个新站点。
我注意到有一个 SiteService
接口,我认为它可以用来做这个 -
SiteInfo site = siteService.createSite("site-dashboard", "mySite",
"mySite", "", SiteVisibility.PUBLIC);
然而,这会导致创建一个无法正常运行的网站,尽管它在 Alfresco Share 仪表板中可见,但我无法使用它。
然后我遇到了 this 代码示例,这正是我想要的。但是该代码包含一个用于进行身份验证的部分,涉及将用户的登录名和密码详细信息发送到 dologin
网络服务。真的不想这样做。
但由于用户已经通过 Alfresco Share 登录,他们应该已经通过身份验证。
如果我从我的代码中调用创建网站的网络脚本,如示例所示(没有初始调用 dologin
),我将收到 401(未经授权)return 代码.
所以我的问题是,如何将我的身份验证告诉创建站点网络脚本?
我阅读了有关使用身份验证票证 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;
}
所以我成功地以编程方式创建了一个站点,这就是我所做的:
首先,忘记编写存储库(平台)网络脚本。在 Alfresco 中创建站点是通过调用共享模块完成的,因此您需要实现页面或自定义菜单项来创建站点。我在身份验证方面也遇到了很多问题,但是如果您通过 Alfresco Share 登录系统,并且在您的 Javascript 中使用提供的 Alfresco Ajax 请求,那么身份验证不应该是问题。
以下是我使用的组件:-
- 创建共享页面以创建您的站点。在 Freemarker 模板 (.ftl) 中添加一个表单来收集站点详细信息。
将表单上的按钮附加到以下 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
}
});
}
我已经实现了一个 Alfresco 存储库网络脚本(在 Java 中)以编程方式创建一个新站点。
我注意到有一个 SiteService
接口,我认为它可以用来做这个 -
SiteInfo site = siteService.createSite("site-dashboard", "mySite",
"mySite", "", SiteVisibility.PUBLIC);
然而,这会导致创建一个无法正常运行的网站,尽管它在 Alfresco Share 仪表板中可见,但我无法使用它。
然后我遇到了 this 代码示例,这正是我想要的。但是该代码包含一个用于进行身份验证的部分,涉及将用户的登录名和密码详细信息发送到 dologin
网络服务。真的不想这样做。
但由于用户已经通过 Alfresco Share 登录,他们应该已经通过身份验证。
如果我从我的代码中调用创建网站的网络脚本,如示例所示(没有初始调用 dologin
),我将收到 401(未经授权)return 代码.
所以我的问题是,如何将我的身份验证告诉创建站点网络脚本? 我阅读了有关使用身份验证票证 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;
}
所以我成功地以编程方式创建了一个站点,这就是我所做的:
首先,忘记编写存储库(平台)网络脚本。在 Alfresco 中创建站点是通过调用共享模块完成的,因此您需要实现页面或自定义菜单项来创建站点。我在身份验证方面也遇到了很多问题,但是如果您通过 Alfresco Share 登录系统,并且在您的 Javascript 中使用提供的 Alfresco Ajax 请求,那么身份验证不应该是问题。
以下是我使用的组件:-
- 创建共享页面以创建您的站点。在 Freemarker 模板 (.ftl) 中添加一个表单来收集站点详细信息。
将表单上的按钮附加到以下 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 } }); }