2015-04-24 9 views
6

Ich sende die folgende URL mit Abfragezeichenfolge. In der Abfragezeichenfolge hat ein Parameter "approverCmt" einen Wert mit Hash (#).Was ist das Verhalten von Hash (#) in Abfragezeichenfolge

"/abc/efd/xyz.jas?approverCmt=Transaction Log #459505&batchNm=XS_10APR2015_082224&mfrNm=Timberland" 

In Server-Seite, wenn ich versuchte, es von der Anfrage abzurufen bekomme ich

approverCmt = Transaction Log -----> "#459505" is missing 
    batchNm = null 
    mfrNm = null 

Und wenn ich Raute (#) von Query-String entfernen oder wenn ich ersetzen # mit% 23 jedes Ding funktioniert fein

Ich verstehe nicht, warum ich null für einen Parameter bekomme, wenn ein anderer Parameter ein Hash (#) Symbol enthält.

Schätzen Sie, wenn jemand erklären kann.

+0

Siehe [diese Frage] (http://stackoverflow.com/questions/20280212/getting-the-full-url- included-the-query-string-after-hash) –

Antwort

10

Dies wird als "Fragmentkennung" bezeichnet.

Wie in wikipedia erwähnt:

Die fragment identifier durch ein Rautenzeichen # eingeführt ist der optionale letzte Teil eines URL für ein Dokument. Es wird normalerweise verwendet, um einen Teil dieses Dokuments zu identifizieren.

Der Teil nach der # ist Info für die client. Es wird nicht an den Server gesendet. Stellen Sie alles ein, was nur der Browser benötigt.

Sie können die Funktion encodeURIComponent() in JavaScript verwenden, um Sonderzeichen in einer URL zu kodieren, sodass Zeichen in andere Zeichen konvertiert werden, so dass Sie sicher sein können, dass Ihre gesamte URL an den Server gesendet wird.

+4

Es ist auch erwähnenswert alles nach diesem Zeichen setzen (wenn nicht codiert) wird nicht an den Server gesendet und nur auf der Client-Seite, was das Problem des OP erklärt. –

+0

@Bartdude: Danke fürs Zeigen. Ich habe diesen Teil auch hinzugefügt. – Prashant

1

der Hash ist ein Dübel:

siehe wikipedia für weitere Informationen

2

Der Hash-Wert für den Anker ist, so ist es nur clientseitige, ist es oft in clientseitigen Rahmen wie Winkel verwendet wird für clientseitiges Routing.

Der Anker ist NICHT serverseitig verfügbar.

In Ihrem Fall brauchen Sie keinen Anker, aber ein Parameterwert mit einem # die Abfragezeichenfolge brechen den Wert "Transaktionsprotokoll # 459505".

EDIT Naive Lösung, die nicht funktioniert, ist es nur für die Geschichte ther lassen, Siehe Direkt Lösung unter

Die Lösung ist clientseitige und

Encoding dekodieren serveur-Seite zu kodieren, in Javascript

encodeURI("Transaction Log #459505") 
    //result value "Transaction%20Log%20#459505" 

Decode in Java

java.net.URLDecoder.decode("Transaction%20Log%20#459505"); 
    //result "Transaction Log #459505" 

EDIT : Aber: Javascript kodiert nicht in der gleichen Weise wie Java So die richtige Antwort (ich hoffe) ist, alle Ihre # manuell mit% 23 zu ersetzen, dann wird Java es normal decodieren, oder encodeURIComponent zu verwenden, wie in Kommentaren vorgeschlagen. Für Ihren Bedarf scheint die Ersatzlösung ausreichend zu sein.

Encode in Javascript:

encodeURI("yourUrl/Transaction Log #459505").replace(/#/,"%23") 
//result: yourUrl/Transaction%20Log%20%23459505 

Die Decodierungs in Java nicht

java.net.URLDecoder.decode("Transaction%20Log%20#459505") 
// result (java.lang.String) Transaction Log #459505 

Sorry für lange Post nicht ändern, ich habe nicht den Unterschied bettween Java und die JavaScrip URL-Codierung

+1

'encodeURI' funktioniert nicht für' /? : @ & = + $ # 'du musst' encodeURIComponent' verwenden – Prashant

+0

Thumbs: so dass das verhalten in Java und Javascript anders ist, ich werde meine antwort aktualisieren – pdem

Verwandte Themen