我想将一系列请求参数(总共超过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)
答案 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
类进行解码