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
相关产品推荐
相关产品推荐

