You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by ta...@apache.org on 2015/07/24 15:10:29 UTC
deltaspike git commit: DELTASPIKE-613 Avoid windowhandler.html in GET
requests from links
Repository: deltaspike
Updated Branches:
refs/heads/master 0166d3532 -> 4ee4c1472
DELTASPIKE-613 Avoid windowhandler.html in GET requests from links
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/4ee4c147
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/4ee4c147
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/4ee4c147
Branch: refs/heads/master
Commit: 4ee4c1472de41ffe7822b2aaf19cce82cb0af81c
Parents: 0166d35
Author: tandraschko <ta...@apache.org>
Authored: Fri Jul 24 15:10:09 2015 +0200
Committer: tandraschko <ta...@apache.org>
Committed: Fri Jul 24 15:10:09 2015 +0200
----------------------------------------------------------------------
.../spi/scope/window/ClientWindowConfig.java | 6 +-
.../scope/window/DefaultClientWindowConfig.java | 6 +
.../component/window/WindowIdHtmlRenderer.java | 1 +
.../resources/deltaspike/windowhandler.js | 150 +++++++++++++------
4 files changed, 118 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4ee4c147/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java
index 74c960f..11ea056 100644
--- a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java
+++ b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java
@@ -86,13 +86,15 @@ public interface ClientWindowConfig extends Serializable
* @return the prepared html which gets sent out to the client as intermediate client window.
*/
String getClientWindowHtml();
-
+
/**
* @return whether localStorage is used in the browser to store the HTML content between client redirects.
* Currently it's only used by {@link ClientWindowRenderMode#CLIENTWINDOW}.
* @see windowhandler.html
*/
- boolean isClientWindowStoreWindowTreeEnabled();
+ boolean isClientWindowStoreWindowTreeEnabled();
+
+ boolean isClientWindowTokenizedRedirectEnabled();
/**
* Restricts the number of active windows.
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4ee4c147/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java
index 5763db3..3005156 100644
--- a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java
+++ b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java
@@ -232,4 +232,10 @@ public class DefaultClientWindowConfig implements ClientWindowConfig
{
return true;
}
+
+ @Override
+ public boolean isClientWindowTokenizedRedirectEnabled()
+ {
+ return false;
+ }
}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4ee4c147/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/component/window/WindowIdHtmlRenderer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/component/window/WindowIdHtmlRenderer.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/component/window/WindowIdHtmlRenderer.java
index 698334b..66bbeb7 100644
--- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/component/window/WindowIdHtmlRenderer.java
+++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/component/window/WindowIdHtmlRenderer.java
@@ -79,6 +79,7 @@ public class WindowIdHtmlRenderer extends Renderer
writer.write("dswh.init('" + windowId + "','" + clientWindowRenderMode.name() + "',{");
writer.write("'storeWindowTree':" + clientWindowConfig.isClientWindowStoreWindowTreeEnabled());
+ writer.write(",'tokenizedRedirect':" + clientWindowConfig.isClientWindowTokenizedRedirectEnabled());
// see #729
if (!delegatedWindowMode && clientWindow.isInitialRedirectSupported(context))
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4ee4c147/deltaspike/modules/jsf/impl/src/main/resources/META-INF/resources/deltaspike/windowhandler.js
----------------------------------------------------------------------
diff --git a/deltaspike/modules/jsf/impl/src/main/resources/META-INF/resources/deltaspike/windowhandler.js b/deltaspike/modules/jsf/impl/src/main/resources/META-INF/resources/deltaspike/windowhandler.js
index dc9bac1..4696bc0 100644
--- a/deltaspike/modules/jsf/impl/src/main/resources/META-INF/resources/deltaspike/windowhandler.js
+++ b/deltaspike/modules/jsf/impl/src/main/resources/META-INF/resources/deltaspike/windowhandler.js
@@ -17,11 +17,11 @@
* under the License.
*/
window.dswh = window.dswh || {
-
+
windowId : null,
clientWindowRenderMode : null,
cfg: null,
-
+
init : function(windowId, clientWindowRenderMode, cfg) {
this.windowId = windowId;
this.clientWindowRenderMode = clientWindowRenderMode;
@@ -34,7 +34,7 @@ window.dswh = window.dswh || {
var targetStrategy = this.strategy[clientWindowRenderMode];
if (targetStrategy) {
targetStrategy.validate();
-
+
// early init
// this is required if e.g. the onload attr is defined on the body tag and our onload handler won't be called
// ATTENTION: the ds:windowId component must be placed as last body tag
@@ -63,25 +63,25 @@ window.dswh = window.dswh || {
} finally {
targetStrategy.init(false);
}
- };
+ };
}
},
strategy : {
-
+
'CLIENTWINDOW' : {
-
+
validate : function() {
this.cleanupCookies();
this.assertWindowId();
},
-
+
init : function(ajax) {
this.overwriteOnClickEvents();
dswh.utils.appendHiddenWindowIdToForms();
},
-
+
assertWindowId : function() {
// ensure that windowIds get checked even if no windowhandler.html is used
if (!window.name || window.name.length < 1) {
@@ -89,39 +89,91 @@ window.dswh = window.dswh || {
window.location = dswh.utils.setUrlParam(window.location.href, 'dswid', null);
}
},
-
+
overwriteOnClickEvents : function() {
- if (dswh.utils.isHtml5() && dswh.cfg.storeWindowTree) {
+
+ var tokenizedRedirectEnabled = dswh.cfg.tokenizedRedirect;
+ var storeWindowTreeEnabled = dswh.utils.isHtml5() && dswh.cfg.storeWindowTree;
+
+ if (dswh.cfg.tokenizedRedirect || storeWindowTreeEnabled) {
var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
- if (!links[i].onclick) {
- links[i].onclick = function() {
- dswh.strategy.CLIENTWINDOW.storeWindowTree();
- return true;
- };
- } else {
- // prevent double decoration
- if (!("" + links[i].onclick).match(".*storeWindowTree().*")) {
- //the function wrapper is important otherwise the
- //last onclick handler would be assigned to oldonclick
- (function storeEvent() {
- var oldonclick = links[i].onclick;
- links[i].onclick = function(evt) {
- //ie handling added
- evt = evt || window.event;
-
- return dswh.strategy.CLIENTWINDOW.storeWindowTree() && oldonclick.bind(this)(evt);
- };
- })();
+ var link = links[i];
+
+ if (storeWindowTreeEnabled) {
+ if (!link.onclick) {
+ link.onclick = function() {
+ dswh.strategy.CLIENTWINDOW.storeWindowTree();
+ return true;
+ };
+ } else {
+ // prevent double decoration
+ if (!("" + link.onclick).match(".*storeWindowTree().*")) {
+ //the function wrapper is important otherwise the
+ //last onclick handler would be assigned to oldonclick
+ (function storeEvent() {
+ var oldonclick = link.onclick;
+ link.onclick = function(evt) {
+ //ie handling added
+ evt = evt || window.event;
+
+ return dswh.strategy.CLIENTWINDOW.storeWindowTree() && oldonclick.bind(this)(evt);
+ };
+ })();
+ }
+ }
+ }
+
+ if (tokenizedRedirectEnabled && dswh.strategy.CLIENTWINDOW.tokenizedRedirectRequired(link) === true) {
+ if (!link.onclick) {
+ link.onclick = function() {
+ dswh.strategy.CLIENTWINDOW.tokenizedRedirect(this);
+ return false;
+ };
+ } else {
+ // prevent double decoration
+ if (!("" + link.onclick).match(".*tokenizedRedirect.*")) {
+ //the function wrapper is important otherwise the
+ //last onclick handler would be assigned to oldonclick
+ (function storeEvent() {
+ var oldonclick = link.onclick;
+ link.onclick = function(evt) {
+ //ie handling added
+ evt = evt || window.event;
+
+ var proceed = oldonclick.bind(this)(evt);
+ if (typeof proceed === 'undefined' || proceed === true) {
+ dswh.strategy.CLIENTWINDOW.tokenizedRedirect(this);
+ return false;
+ }
+ return proceed;
+ };
+ })();
+ }
}
}
}
}
},
-
+
+ tokenizedRedirectRequired : function(link) {
+ // skip link without href
+ if (link.href && link.href.length > 0) {
+ return true;
+ }
+
+ return false;
+ },
+
+ tokenizedRedirect : function(link) {
+ var requestToken = dswh.utils.generateRequestToken();
+ dswh.utils.storeCookie('dsrwid-' + requestToken, dswh.windowId, 3);
+ window.location = dswh.utils.setUrlParam(link.href, 'dsrid', requestToken);
+ },
+
/**
* store the current body in the html5 localstorage
- */
+ */
storeWindowTree : function() {
// first we store all CSS we also need on the intermediate page
var headNodes = document.getElementsByTagName("head")[0].childNodes;
@@ -149,7 +201,7 @@ window.dswh = window.dswh || {
localStorage.setItem(window.name + '_bodyAttrs', body.getAttribute("class"));
return true;
},
-
+
cleanupCookies : function() {
var dsrid = dswh.utils.getUrlParameter(window.location.href, 'dsrid');
if (dsrid) {
@@ -159,12 +211,12 @@ window.dswh = window.dswh || {
},
'LAZY' : {
-
+
validate : function() {
this.cleanupCookies();
this.assertWindowId();
},
-
+
init : function(ajax) {
dswh.utils.appendHiddenWindowIdToForms();
},
@@ -179,13 +231,13 @@ window.dswh = window.dswh || {
if (dswid) {
// initial redirect case
// the windowId is valid - we don't need to a second request
- if (dswh.cfg.initialRedirectWindowId && dswid === dswh.cfg.initialRedirectWindowId) {
+ if (dswh.cfg.initialRedirectWindowId && dswid === dswh.cfg.initialRedirectWindowId) {
window.name = dswh.cfg.initialRedirectWindowId;
}
else {
// -- url param available, we must recreate a new windowId to be sure that it is new and valid --
- // set tempWindowId to remember the current state
+ // set tempWindowId to remember the current state
window.name = 'tempWindowId';
// we remove the dswid if available and redirect to the same url again to create a new windowId
window.location = dswh.utils.setUrlParam(window.location.href, 'dswid', null);
@@ -210,7 +262,7 @@ window.dswh = window.dswh || {
}
}
},
-
+
cleanupCookies : function() {
var dswid = dswh.utils.getUrlParameter(window.location.href, 'dswid');
if (dswid) {
@@ -219,9 +271,9 @@ window.dswh = window.dswh || {
}
}
},
-
+
utils : {
-
+
isHtml5 : function() {
try {
return !!localStorage.getItem;
@@ -237,7 +289,7 @@ window.dswh = window.dswh || {
}
return someArray.join("|||");
},
-
+
equalsIgnoreCase : function(source, destination) {
//either both are not set or null
if (!source && !destination) {
@@ -249,7 +301,7 @@ window.dswh = window.dswh || {
//in any other case we do a strong string comparison
return source.toLowerCase() === destination.toLowerCase();
},
-
+
getUrlParameter : function (uri, name) {
// create an anchor object with the uri and let the browser parse it
var a = document.createElement('a');
@@ -300,7 +352,7 @@ window.dswh = window.dswh || {
}
return newQuery;
},
-
+
appendHiddenWindowIdToForms : function() {
var forms = document.getElementsByTagName("form");
for (var i = 0; i < forms.length; i++) {
@@ -316,13 +368,25 @@ window.dswh = window.dswh || {
dspwid.value = dswh.windowId;
}
},
-
+
expireCookie : function(cookieName) {
var date = new Date();
date.setTime(date.getTime()-(10*24*60*60*1000)); // - 10 day
var expires = ";max-age=0;expires=" + date.toGMTString();
document.cookie = cookieName + "=" + expires + "; path=/";
+ },
+
+ generateRequestToken : function() {
+ return Math.floor(Math.random() * 999);
+ },
+
+ storeCookie : function(name, value, seconds) {
+ var expiresDate = new Date();
+ expiresDate.setTime(expiresDate.getTime() + (seconds * 1000));
+ var expires = "; expires=" + expiresDate.toGMTString();
+
+ document.cookie = name + '=' + value + expires + "; path=/";
}
}
};