Создайте URL с параметрами запроса в Java - PullRequest
4 голосов
/ 08 июля 2011

У меня есть сервлет, доступ к которому осуществляется через URL, и в этом URL есть некоторые параметры запроса. Теперь мне нужно перенаправить пользователя на другую страницу (из сервлета), а также добавить параметры запроса, которые я получил из запроса. Это то, что я делаю

    StringBuffer sb=new StringBuffer("/test.jsp");
    sb.append( "?" );
    Enumeration en = request.getParameterNames();
    while( en.hasMoreElements() ){
        String paramName = (String) en.nextElement();
        sb.append( paramName );
        sb.append( "=" );
        sb.append(request.getParameter( paramName ));
        sb.append("&");
    }
           String constructedURLWithParams=sb.toString();

Но проблема в том, что есть «&», который будет добавлен к концу созданного URL. Я не хочу снова выполнять строковые операции и удалять завершающий символ "&". Можете ли вы предложить лучший способ сделать это?

Ответы [ 3 ]

6 голосов
/ 08 июля 2011

Это распространенный сценарий.Я собираюсь немного упростить это, чтобы проиллюстрировать некоторые решения:


Option # 1 - удалить последний символ, изменив длину StringBuffer:

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    sb.append(",");
}
if (sb.length() > 0) {
    sb.setLength(sb.length() - 1);
}
System.err.println(sb.toString());

Option# 2 - добавить разделитель, если буфер не пустой

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    if (sb.length() > 0) {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

Опция # 3 - добавить разделитель, если есть больше элементов ...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    if (en.hasMoreElements()) {
        sb.append(",");
    }
}
System.err.println(sb.toString());

Вариант № 4 - добавить разделитель, если это не первый раз в цикле ...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
boolean first = true;
while (en.hasMoreElements())
    if (first) {
        first = false;
    } else {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

Что лучше всего зависит от точных деталей того, что вы делаете, и насколько важнопроизводительность.


Наконец, я должен отметить, что вам нужно быть немного более осторожным при сборке URL-адресов в целом и строк запросов.Например, вам нужно правильно экранировать любые символы, которые не являются «незарезервированными» (согласно спецификации URL) в именах и значениях параметров.Если вы неосторожны, вы можете получить вектор для внедрения XSS-атак на ваш сайт.

4 голосов
/ 08 июля 2011

См. Этот вопрос, как легко создать строку из некоторой коллекции: Какой самый элегантный способ объединить список значений с разделителем в Java?

Также в вашем коде есть ошибка: вы должны экранировать значения, так как и paramName, и параметры запроса могут содержать & и другие недопустимые символы. Для этого используйте URLEncoder.encode(value, "UTF-8").

3 голосов
/ 08 июля 2011

Просто добавьте "?" + request.getQueryString() (если параметры передаются в URL - строка запроса содержит все параметры get)

Если это не так, то ваш подход кажется нормальным.Просто есть

if (en.hasMoreElements()) sb.append("&");
...