Da ich nicht sehe, dass Chrome fügt einige spezifische Header (oder sowieso benachrichtigt den Server über Prerendering-Status) ist es wahrscheinlich nicht möglich, es auf der Serverseite zu erkennen ... zumindest nicht direkt. Sie können jedoch die Erkennung auf der Clientseite simulieren und später mit dem Serveraufruf kombinieren.
Beachten Sie, dass Sie auf der Client-Seite detect prerendering:
if (document.webkitVisibilityState == 'prerender' || document.visibilityState == 'prerender' || document.visibilityState[0] == 'prerender') {
// prerendering takes place
}
Jetzt können Sie auf Client-Seite brechen Vorbelastung durch Alert-Box im Falle Browser zeigt ist der Zustand in Vorbelastung (oder Sie können tun, wahrscheinlich das gleiche mit nur einem gewissen Fehler in JavaScript aktivieren, anstatt Alarm zu verwenden()):
if (document.webkitVisibilityState == 'prerender' || document.visibilityState == 'prerender' || document.visibilityState[0] == 'prerender') {
alert('this is alert during prerendering..')
}
Nun, wenn Chrom prerenders die Seite es wird scheitern, weil die Javascript-alert den Browser Javascript, um fortzufahren verhindert die Ausführung.
Wenn Sie in Chrom Typ: chrome: // net-internals/# Prerender Sie verfolgen können, wann und für welche Seiten Chrom Pre-Rendering ausführt.Im Falle des obigen Beispiels (mit Warnfeld während prerendering) kann man dort sehen:
link rel Prerender (Kreuz Domäne) http://some.url.which.is.preloadedJavascript Alarm 2015.06.07 19: 26: 18,758
Der Endzustand - Javascript Alret beweist, dass Chrom die Seite vorzuladen fehlgeschlagen (ich diese getestet haben).
Nun, wie kann dies Ihr Problem lösen? Nun können Sie diese kombinieren mit asynchronem Aufruf (AJAX) und einige Inhalte laden (von einer anderen URL), je nach wheater der Seite tatsächlich prerendering oder nicht.
Betrachten Sie folgenden Code (die von Ihrem Portlet unter url/Test-Portlet gemacht werden könnten):
<html>
<body>
<div id="content"></div>
<script>
if (document.webkitVisibilityState == 'prerender' || document.visibilityState == 'prerender' || document.visibilityState[0] == 'prerender') {
// when chrome uses prerendering we block the request with alert
alert('this is alert during prerendering..');
} else {
// in case no prerendering takes place we load the actual content asynchronously
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// when the content is loaded we place the html inside "content" div
document.getElementById('content').innerHTML = xhr.responseText;
}
}
xhr.open('GET', '/hidden-portlet', true); // we call the actual portlet
xhr.send(null);
}
</script>
</body>
</html>
Wie Sie sehen das/hidden-Portlet nur bei Browser geladen wird, wird die Seite normalerweise geladen (ohne Vorladung). Der serverseitige Handler unter URL/verstecktes Portlet (der ein anderes Portlet/Servlet sein kann) enthält tatsächlichen Code, der während des Vorrenderns nicht ausgeführt werden sollte. So ist es die/hidden-Portlets, die
dummyRepository.changeSomeData(request.getAttribute("userId"));
Dieses Portlet auch normale Ansicht zurückkehren kann (gerendert html) ausführt, die asynchron auf der Seite unter url/Test-Portlet dank den Trick platziert wird auf/test- Portlet: document.getElementById('content').innerHTML = xhr.responseText;
.
So das Portlet unter der Adresse/Test-Portlet sumarize nur html mit einem Javascript-Code zurückgibt, die tatsächliche Portlet auslöst.
Wenn Sie viele zerbrechliche Portlets haben, können Sie damit noch weiter gehen, so dass Sie/test-portlet mit Anfrageparameter wie /test-portlet?actualUrl=hidden-portlet
parametrisieren können, so dass die Adresse des tatsächlichen Portlets von url genommen wird (was als gelesen werden kann) Parameter auf Serverseite anfordern). Server wird in diesem Fall dynamisch die URL übertragen, die geladen werden soll:
Anstatt also fest einprogrammiert:
xhr.open('GET', '/hidden-portlet', true);
Sie haben
xhr.open('GET', '/THIS_IS_DYNAMICALLY_REPLACED_EITHER_ON_SERVER_OR_CLIENT_SIDE_WITH_THE_ADDRES_FROM_URL', true);
haben Sie untersucht die Request-Header? Gibt es Header, die anzeigen, dass Sie sich im "Vorladen" -Szenario befinden? In diesem Fall können Sie alles überspringen, was Sie überspringen müssen. – geert3
können Sie kurz beschreiben, was Ihre Datenbankprozeduren sind? –
@MSIbrahim Ich habe gerade das Szenario vereinfacht. Tatsächlich gibt es einen REST-API-Aufruf, der 2 Datenbanken manipuliert. Ich denke nicht, dass dies relevant ist, da ich auf keinen Fall Änderungen auf einer niedrigeren Ebene vornehmen möchte, da es sich ausschließlich um das Problem der Web-Ebene handelt. – Reins