2015-04-24 2 views
6

Я отправляю следующий url с строкой запроса. В строке запроса один параметр «approverCmt» имеет значение с hash (#).Каково поведение Hash (#) в строке запроса

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

В стороне сервера, когда я пытался извлечь его из запроса я получаю

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

И если я удалить хэш (#) из строки запроса или если я заменю # с% 23 каждая вещь работ fine

Я не понимаю, почему я получаю null для одного параметра, если другой параметр содержит символ хеша (#).

Цените, если кто-нибудь может объяснить.

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/20280212/getting-the-full-url-including-the-query-string-after-hash) –

ответ

10

Это называется «идентификатор фрагмента».

Как упоминалось в wikipedia:

fragment identifier введенный в хэш-знак # является необязательным последняя часть URL для документа. Он обычно используется для идентификации части этого документа.

Часть после # - это информация для client. Он не отправляется на сервер. Поместите все, что нужно браузеру.

Вы можете использовать функцию encodeURIComponent() в JavaScript для кодирования специальных символов в URL-адресе, чтобы символы # были преобразованы в другие символы таким образом, что вы можете быть уверены, что весь ваш URL-адрес будет отправлен на сервер.

+4

Также стоит упомянуть все, что помещено после этого символа (если некодировано) не отправляется на сервер и используется только на стороне клиента, объясняя проблему OP. –

+0

@Bartdude: спасибо за указание. Я добавил эту часть также. – Prashant

1

хэш якорь:

см wikipedia для получения дополнительной информации

2

значение хеш-функции для якоря, так что это только на стороне клиента, он часто используется в клиентской стороне рамки, как угловые для маршрутизации на стороне клиента.

Якорь НЕ доступен на стороне сервера.

В вашем случае вам не нужен якорь, но значение параметра с # сломает строку запроса, это значение «Журнал транзакций № 459505».

EDIT Наивное решение, которое не работает, только пусть это þér для истории, см Настоящее решение ниже

Решение для кодирования на стороне клиента и расшифровывает Serveur стороне

Кодирование в JavaScript

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

Decode в Java

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

EDIT: Но: Javascript не кодируется так же, как Java Итак, правильный ответ (я надеюсь) заключается в том, чтобы вручную заменить все ваши # на% 23, тогда Java будет декодировать его в обычном режиме или использовать encodeURIComponent, как это предлагается в комментариях. Для вашей потребности решение замены кажется достаточным.

Encode в Javascript:

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

декодирование в Java не меняет

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

Извините за длинный пост, я не вижу разницы bettween Java и JavaScrip Url кодирования

+1

'encodeURI' не будет работать для' /? : @ & = + $ # 'вам нужно использовать' encodeURIComponent' – Prashant

+0

Thancks: так Stange поведение отличается от Java и Javascript, я буду обновлять свой ответ – pdem