2013-04-27 19 views
9

Ich möchte den location.hash verwenden, um den Status meiner Client-App zu verschlüsseln, sodass Benutzer die App ganz einfach mit der URL als Lesezeichen speichern und/oder freigeben können.Maximale Größe von location.hash im Browser

Es gibt eine Reihe von (veralteten) Themen auf der maximalen Länge einer URL, insbesondere Grenzen im Internet Explorer. Es ist jedoch nicht klar, was die maximale Größe der location.hash ist. Da der Hash nur im Client vorhanden ist, sind Einschränkungen von http oder Servern nicht relevant.

Ich machte eine einfache jsfiddle, um dies zu testen: http://jsfiddle.net/Jz3ZA/. In Chrome und Firefox (Ubuntu 12.04) scheinen Hashes bis zu 50K zu funktionieren. Bedeutet das, dass ich sie verwenden könnte, um den Staat zu lagern, oder überhöre ich andere Einschränkungen? obwohl

+2

Es gibt keinen Standard für die Größenbeschränkungen auf bei allen URLs, so dass der Hash theoretisch beliebig lang sein können, aber man kann nicht darauf verlassen, was bestimmte Browser tun (vor allem IE). –

+0

Warum speichern Sie den Status nicht in einem Server? – Blender

+0

Ich habe Ihre Geige auf Internet Explorer 11 laufen lassen und es schlägt bei Hash-Länge 3000 –

Antwort

-2

What is the maximum length of a URL in different browsers?

Dies beinhaltet typischerweise nicht den Hash-Teil, so dass ich glaube nicht, dass es ein Standard.

Ich möchte darauf hinweisen, dass die Fragment-ID in der Regel verwendet wird, um ein Fragment eines Dokuments zu identifizieren, und sollte nicht verwendet werden, um den gesamten Zustand einer App zu speichern. Sie sollten stattdessen localstorage verwenden.

Wenn Sie die Möglichkeit zum Freigeben oder Lesezeichen haben möchten, sollten Sie den Status der Anwendung auf der Serverseite speichern und die Fragment-ID zum Speichern der ID des gespeicherten Status verwenden.

+3

Die Frage war explizit über den Hash-Teil, so dass dies die Frage nicht beantwortet. – Jeroen

-1

Eine solche irreführende Erklärung. Hash hat keine Größenbeschränkungen und kann beliebig oft verwendet werden. Denken Sie daran, dass es kein URL-Teil ist.

+1

Ich glaube nicht, dass das wahr ist.Wikipedia sagt: * Der Fragment-Bezeichner, der durch ein Hash-Zeichen # eingeführt wird, ist der optionale letzte Teil einer URL für ein Dokument. * – Jeroen

4

Basierend auf Ihrer JS Fiddle (gut eine modifizierte Version davon http://jsfiddle.net/Jz3ZA/18/ (siehe Codebeispiel unten)), können Sie viele Browser testen, um eine effektive Baseline zu erhalten.

  • Chrome: 50K +
  • Firefox: 50K +
  • Safari (iOS): 50K +
  • Internet Explorer 11: schlägt zwischen 2.025 und 2.050
  • Microsoft Edge: schlägt fehl zwischen 2.025 und 2.050

Egal, was andere Browser unterstützen, wenn Sie Microsoft Edge oder IE11 unterstützen müssen, müssen Sie unter 2.025 Character-Hashes bleiben. Da IE (und damit ich rate Edge) in der Vergangenheit URL Längenbeschränkungen hatte ... kann dies auch von der Länge Ihrer Basis-URL abhängen.

function testall(){ 
 
    var sizes = [10,100,1000,2000,2025,2050,2100,2250,2500,2750,3000,4000,5000,10000, 50000]; 
 
    for(var i=0;i<sizes.length;i++){ 
 
    var n = sizes[i]; 
 
    if(!testhash(n)){ 
 
     alert("test failed at hash of length: " + n); 
 
     return; 
 
    } 
 
    } 
 
    alert("all tests passed"); 
 
} 
 

 
function testhash(n){ 
 
    var somestring = "#" + makestring(n); 
 
    window.location.hash = somestring; 
 
    var success = (window.location.hash == somestring); 
 
    return success 
 
}  
 

 
function makestring(n){ 
 
    var text = ""; 
 
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
 

 
    for(var i=0;i<n;i++){ 
 
     text += possible.charAt(Math.floor(Math.random() * possible.length)); 
 
    } 
 
    return text; 
 
} 
 
$("button").on("click", testall);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
 
<button>Test!</button>