Передача очень длинного URL в запрос HTTPServletRequest - PullRequest
0 голосов
/ 06 июня 2018

Я хочу передать длинную серию параметров запроса (всего более 2000 символов) из одного .jsp в другой (через URL) и заставить его воспринимать HTTPServletRequest так, как если бы он получал параметры запроса нормально.

Я не могу просто передать URL-адрес обычным образом, поскольку IE11 усекает URL-адрес до 2000 символов (см. Какая максимальная длина URL-адреса в разных браузерах? ), поэтому мне нужно иметькакой-то обходной путь.

Тривиально сохранить URL-адрес в ClientSession с ключом в одном .jsp

public String addValue(String aString) {
    String key=""+UUID.randomUUID();
    mapValues.put(key, aString);
    return key;
}

, а затем извлечь его в другом .jsp

public String getValue(String key) {
        return mapValues.get(key);
}

Однако другой .jsp нужен HTTPServletRequest, а не строка

Т.е. мне нужно иметь возможность сделать

public MyPosition(HttpServletRequest request) {
        this.id= (String)request.getParameter("ID");

Есть ли способ сделать это путем преобразования полученногоURL к HTTPServletRequest?

Я знаю, что мог бы переписать MyPosition, чтобы взять строку и извлечь из нее данные напрямую, но я бы предпочел не трогать очень длинный, унаследованный код.

Если бы я могсделайте setParameter по запросу, тогда это будет решением.Но такая опция недоступна (см. HttpServletRequest - SetParameter )

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

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

0 голосов
/ 27 июня 2018

Я испробовал решения @ dimplex и @ Deadron, которые, как мне кажется, должны работать, но не смогли реализовать ни то, ни другое за тот короткий промежуток времени, который у меня был.

В итоге я заменил параметр HTTPServletRequest request в функции MyPosition на String urlKey и добавил следующую строку внутри функции

RequestStr request=new RequestStr(cSession,urlKey);

, теперь мой существующий код не нуждался вбудет изменен вообще, и request.getParameter("paramName") вызовет мою функцию ниже.

public class RequestStr {
    String url = "";

    public RequestStr(ClientSession cSession, String urlKey) {
        super();
        this.url = cSession.getValue(urlKey);
    }

    public String getParameter(String aParam) {
        int i = url.indexOf("?" + aParam + "=");
        if (i == -1) {
            i = url.indexOf("&" + aParam + "=");
        }
        if (i == -1) {
            return null;
        } else {

            int j = url.indexOf("&", i + 1);
            if (j == -1) {
                return url.substring(i + aParam.length() + 2);
            } else {
                return url.substring(i + aParam.length() + 2, j);
            }
        }
    }

}

Так что все, что мне нужно было сделать, это сохранить очень длинный URL в сеансе в карте с ключом urlKey, а затемв запросе только что передали этот urlKey, и затем я мог получить длинный URL-адрес через urlKey, а затем декодировать его через мой RequestStr класс

0 голосов
/ 06 июня 2018

Единственный способ изменить HttpServletRequest - обернуть it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...