You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 7.4自定义Portlet中Ajax调用致会话失效问题求助

Liferay 7.4自定义Portlet Ajax调用触发会话失效问题排查方案

1. 检查CSRF令牌处理

Liferay 7.4默认启用CSRF保护,若Ajax请求未正确携带CSRF令牌,系统可能误判为非法请求触发会话过期。

  • 解决方式:在Ajax请求中加入Liferay官方CSRF令牌。通过Liferay.authToken获取令牌,可在请求头或参数中传递:
$.ajax({
    url: '/your-portlet-resource-url',
    type: 'POST',
    headers: {
        'X-CSRF-Token': Liferay.authToken
    },
    // 其他请求参数
});

2. 确认会话Cookie传递

若Ajax请求未正确携带Liferay会话Cookie(如JSESSIONID),服务器无法识别会话,可能触发失效逻辑。

  • 解决方式:确保请求配置中开启Cookie携带,跨域场景需显式设置withCredentials:
$.ajax({
    url: '/your-portlet-resource-url',
    type: 'POST',
    xhrFields: {
        withCredentials: true
    },
    // 其他请求参数
});

3. 规范Portlet资源URL生成

若手动拼接Ajax请求URL,可能因参数错误触发会话过期逻辑,需使用Liferay官方方法生成资源URL。

  • 解决方式:通过Liferay.PortletURL.createResourceURL()生成合法地址:
var resourceURL = Liferay.PortletURL.createResourceURL();
resourceURL.setPortletId('your-portlet-id');
resourceURL.setResourceId('your-target-resource-id');

$.ajax({
    url: resourceURL.toString(),
    type: 'POST',
    headers: {
        'X-CSRF-Token': Liferay.authToken
    },
    // 其他请求参数
});

4. 排查过滤器异常拦截

即便已检查过过滤器,仍需确认自定义/第三方过滤器是否在处理Ajax请求时错误调用expire_session接口或修改会话状态。

  • 解决方式:在过滤器中添加日志,跟踪请求处理流程,重点排查SessionExpirationFilter相关的自定义扩展逻辑。

5. 调整Portal属性的CSRF配置

确认auth.token.check.enabled为true的同时,检查auth.token.ignore.actions是否包含你的Portlet资源动作,避免不必要的令牌检查。

  • 解决方式:在portal-ext.properties中添加配置(替换为实际的Portlet命名空间和动作):
auth.token.ignore.actions=VIEW,/your-portlet-namespace/your-resource-action

6. 规范Ajax请求类型与格式

若使用GET请求传递敏感参数,或请求内容格式不符合Liferay预期,可能触发安全拦截导致会话失效。

  • 解决方式:数据修改操作使用POST请求,确保请求内容类型为application/x-www-form-urlencoded或multipart/form-data。

内容的提问来源于stack exchange,提问作者Sami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:15:02