将非常长的URL传递给HTTPServletRequest

时间:2018-06-06 14:33:22

标签: java jsp httprequest

我想将一系列请求参数(总共超过2000个字符)从一个.jsp传递到另一个(通过URL),并使它看起来像接收HTTPServletRequest一样,就好像它收到了请求一样参数通常。

我不能简单地传递URL,因为IE11正在截断大约2000个字符的URL(参见What is the maximum length of a URL in different browsers?)所以我需要有一些解决方法。

使用一个密钥保存ClientSession中的url是非常简单的.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 :(得分:1)

修改HttpServletRequest的唯一方法是wrap它。

答案 1 :(得分:1)

听起来你想要制作一个标准的POST请求而不是听起来像GET请求。

答案 2 :(得分:0)

我尝试了@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);
            }
        }
    }

}

所以我要做的就是用键urlKey将非常长的URL保存在会话中的映射中,然后在请求中刚刚传递了这个urlKey,然后我就可以检索长通过urlKey的URL,然后通过我的RequestStr类进行解码