Details
-
Type: Bug
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: 3.1.0.BETA1
-
Fix Version/s: 3.1.0.BETA2, 3.1, EE-3.0.0.GA_P01
-
Labels:None
-
Environment:Portal ICEpush
Description
Initially reported by Neil at Liferay (http://issues.liferay.com/browse/FACES-1171), there appears to be a problem when using Ajax Push as an inter-portlet communication (IPC) strategy. This is where one portlet changes some shared state and attempts to render all the relevant views.
The symptom is a SessionExpiredException reported by our custom exception handler.
The symptom is a SessionExpiredException reported by our custom exception handler.
-
Hide
- multi-view-push-test.zip
- 21 kB
- Deryk Sinotte
-
- multi-view-push/.DS_Store 6 kB
- __MACOSX/multi-view-push/._.DS_Store 0.1 kB
- multi-view-push/build.xml 0.8 kB
- multi-view-push/pom.xml 1 kB
- multi-view-push/src/main/.DS_Store 6 kB
- __MACOSX/multi-view-push/.../._.DS_Store 0.1 kB
- multi-view-push/.../DebugPhaseListener.java 0.8 kB
- multi-view-push/src/.../sample/Simple.java 2 kB
- multi-view-push/src/.../resources/.DS_Store 6 kB
- __MACOSX/multi-view-push/.../._.DS_Store 0.1 kB
- multi-view-push/src/.../webapp/.DS_Store 6 kB
- __MACOSX/multi-view-push/.../._.DS_Store 0.1 kB
- multi-view-push/src/.../simple01.xhtml 0.6 kB
- multi-view-push/src/.../simple02.xhtml 0.6 kB
- multi-view-push/src/.../WEB-INF/.DS_Store 6 kB
- __MACOSX/multi-view-push/.../._.DS_Store 0.1 kB
- multi-view-push/src/.../faces-config.xml 1 kB
- multi-view-push/src/main/.../WEB-INF/web.xml 3 kB
- multi-view-push-portlet/build.xml 1 kB
- __MACOSX/.../._build.xml 0.2 kB
- multi-view-push-portlet/pom.xml 7 kB
- multi-view-push-portlet/.../liferay-display.xml 2 kB
- multi-view-push-portlet/.../liferay-plugin-package.properties 2 kB
- multi-view-push-portlet/.../liferay-portlet.xml 3 kB
- multi-view-push-portlet/src/.../portlet.xml 3 kB
Activity
- All
- Comments
- History
- Activity
- Remote Attachments
- Subversion
Checked in some changes to prevent the updated ViewState being applied to forms outside the relevant portlet that initiated the request or push updates.
Show
Deryk Sinotte
added a comment - Checked in some changes to prevent the updated ViewState being applied to forms outside the relevant portlet that initiated the request or push updates.
Thanks Deryk!
Show
Neil Griffin
added a comment - Thanks Deryk!
This fix should be applied to the maintenance branch for EE 3.0.0.GA_P01.
Changes applied to the maintenance branch:
Sending compat/core/src/main/javascript/status.js
Sending core/src/main/javascript/application.js
Sending core/src/main/javascript/blockui.js
Committed revision 29265.
Show
Deryk Sinotte
added a comment - Changes applied to the maintenance branch:
Sending compat/core/src/main/javascript/status.js
Sending core/src/main/javascript/application.js
Sending core/src/main/javascript/blockui.js
Committed revision 29265.
Attaching simple test case that uses push across portlets on the same page.
Show
Deryk Sinotte
added a comment - Attaching simple test case that uses push across portlets on the same page.
Here are my notes on the issue to date:
1) The issue seems constrained to a problem with Push. I can run and interact with two separate portlets without seeing the issue. The exception only occurs after one or two Push renders are triggered.
2) The SessionExpiredException is slightly misleading. We add that exception handling to attempt to catch cases where a ViewExpiredException is thrown in a situation when the session has expired. In this case, it's not a session expiry but truly a ViewExpiredException.
3) I've narrowed it down to the fact to an update that comes back and updates the javax.faces.ViewState so that the returned value is applied to all views on the page (not just the portlet it actually belongs to. I've also constructed a test case that illustrates the ViewState "contamination" that occurs. In other words, when interacting with the first portlet and triggering a push, the updates for the 2nd portlet also include a ViewState value that gets applied back to the 1st portlet. Any subsequent interaction with that first portlet will throw a ViewExpiredException but that ViewState value doesn't exist for that view.