2009-10-28 16 views
9

Sto scrivendo un JSP/Servlet e sto cercando di ottenere la parte l'ancora del URI per esempio:Get ancoraggio da URI

blabla.rdf#mark 

Come faccio ad avere il mio marchio da mia richiesta? Ovviamente request.getParameter() non funziona?

Qualsiasi aiuto sarebbe benvenuto.

+0

Ecco una domanda simile per PHP, con risposte similmente aggiornate: http://stackoverflow.com/questions/1032242/how-to-obtain-anchor-part-of-url-after-in-php –

risposta

19

Ciò non è possibile in quanto i clienti non inviano la "parte di ancoraggio" al server

A titolo di esempio, ecco la richiesta precisa che Chrome ha generato dopo la presentazione http://example.com/#foobar (registrato utilizzando Wireshark):

GET/HTTP/1.1 
Host: example.com 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.3 (KHTML, like Gecko) Chrome/4.0.223.11 Safari/532.3 
Cache-Control: max-age=0 
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
If-None-Match: "b300b4-1b6-4059a80bfd280" 
If-Modified-Since: Tue, 15 Nov 2005 13:24:10 GMT 

Vedere, no #foobar. Quindi non c'è modo che un'applicazione server possa leggerlo.

È possibile eseguire alcune magie JavaScript per archiviare l'ancora in un cookie o in un campo di input nascosto o qualunque sia il voodoo in cui ci si trova. Ma non funzionerà mai per richieste che non provengono dai tuoi stessi siti. È più semplice fare tutto ciò che serve sulla parte server della stringa di query e utilizzare l'ancora solo per le attività di solo JavaScript o usarlo per navigare all'interno di un semplice documento HTML, ma è così 90s;).

Ecco la parte importante della RFC 1808 citato:

Si noti che l'identificatore di frammento (e il "#" che lo precede) è parte non considerato dell'URL. Tuttavia, poiché viene comunemente utilizzato nello stesso contesto di stringa di un URL, un parser deve essere in grado di riconoscere il frammento quando è presente e metterlo da parte come parte di durante il processo di analisi.

+0

Per informazioni , [RFC 1808] (http://www.ietf.org/rfc/rfc1808.txt) che spiega perché la parte di ancoraggio non viene inviata al server. –

0

Questa soluzione funziona solo dopo un pulsante di invio è stato premuto, ma: si potrebbe usare javascript per inserire un valore nascosto sul modulo che viene impostata al valore di document.location. Questo ti direbbe esattamente ciò che il browser sta vedendo come il tuo indirizzo.

2

Immagino che vogliate creare un'applicazione web Ajax che possa essere aggiunta ai segnalibri e che vogliate sostituire alcuni frammenti del DOM senza ricaricare l'intera pagina. (In alternativa è possibile utilizzare i parametri di query.) Come menzioni sfussenegger, il browser non trasmette 'anchor' al server. La soluzione è sul lato client.

Javascript window.location.hash fornisce le informazioni di ancoraggio. È possibile aggiungere un gestore eventi all'evento che acquisisce window.location.hash e lo trasmette al server in un Ajax XHttpRequest. Prendi la risposta e la costruisci nel DOM.

Sfortunatamente, si tratta di due round trip client-server.

Maggiori informazioni su questo indirizzo ajaxpatterns.