我想从 javascript 代码中进行 ajax 调用(以检查用户会话是否仍处于活动状态)。我希望我的代码独立于任何 portlet,因此希望在 javascript 中构建 url,而不必依赖 portlet id。
这可能在 MVCPortlet 框架内吗?如果没有,有替代品吗?
在此行下方编辑。
我知道liferay的会话管理机制,我实际上已经设置了会话的自动扩展。但是我的两个用户丢失了他们的长时间输入,因为尽管有这种机制,会话还是过期了(我相信他们打断了他们的工作,他们的计算机进入了睡眠状态......)。
我想通过在从某些表单提交输入之前检查会话是否仍处于活动状态来避免这种情况。我这样做的方式是在提交之前添加一个 ajax 调用,我将在下面详细介绍。
我真正的问题是:如何在该代码中消除对 portletId 的依赖,这样我就不需要更改要在其中实现此机制的每个 portlet。
我今天使用以下 javascript 函数执行此操作:
Liferay.provide(window, "bb_checkSession",
function (sessionId, portletId, successCallback, failureCallback) {
var A = AUI();
var resourceUrl = Liferay.PortletURL.createResourceURL();
resourceUrl.setResourceId("CHECK_SESSION");
resourceUrl.setPortletId(portletId);
A.io.request(resourceUrl.toString(), {
method: 'GET',
cache: false,
on: {
success: function () {
var responseData = A.JSON.parse(this.get('responseData'));
if (responseData == null || sessionId != responseData.sessionId) {
if (failureCallback) failureCallback();
} else {
if (successCallback) successCallback();
}
},
failure: function () {
if (failureCallback) failureCallback();
}
}
});
},
['aui-io', 'liferay-portlet-url']
);
在我的 portlet 中,我按如下方式处理调用
public void checkSession(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException {
PortletSession session = resourceRequest.getPortletSession();
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
resourceResponse.setContentType("text/javascript");
jsonObject.put("sessionId", session.getId());
resourceResponse.getWriter().write(jsonObject.toString());
}