如何避免HttpServletRequest.getReader和getParameterValues的干扰?

时间:2013-10-01 14:15:12

标签: java servlets

在我的应用程序中,我必须提取请求的参数,并按照它们在查询字符串中的出现顺序放入集合中。

例如,如果发件人发出以下请求,

http://myapp.com/myrequest?param3=value3&param2=value2&param1=value1

我需要生成一个集合,其中的元素按以下顺序放置:param3,param2,param1。

为实现这一目标,我首先使用下面显示的方法getParameterNames提取参数名称。

private List<String> getParameterNames(HttpServletRequest aRequest) 
  throws IOException {
    final List<String> parameterNames = new LinkedList<>();
    final BufferedReader reader = aRequest.getReader();
    final String queryString = IOUtils.toString(reader);

    final String[] parameterValuePairs = queryString.split("&");

    for (String parameterValuePair : parameterValuePairs) {
        final String[] nameValueArray = parameterValuePair.split("=");

        parameterNames.add(nameValueArray[0]);
    }
    return parameterNames;
}

问题:在调用此方法后,aRequest.getParameterValue(...)会为参数名称返回null

如果我这样做 - 首先保存参数图,然后调用getParameterNames,然后其结果为空。

final Map<String,String[]> parameterMap = aRequest.getParameterMap();
final List<String> parameterNames = getParameterNames(aRequest);

我尝试了以下事项:

  1. 确保reader.close()中没有调用getParameterNames(我在其他地方读到这可能会导致问题)。
  2. 调用reader.reset()
  3. 这一切都没有帮助。

    如何从HttpServletRequest获取参数值对的列表,该列表按参数在查询字符串中的外观排序?

1 个答案:

答案 0 :(得分:0)

使用第一种方法,您无需使用Reader来获取参数。而是做:

final List<String> parameterNames = new LinkedList<>();
final String queryString = query.getQueryString(); // get query string from query itself
// rest of your code stays unchanged

它不起作用的原因是因为请求输入流中的数据只能读取一次。

或者,如果我错了,情况并非如此,您可以将参数及其值保存到LinkedHashMap

final LinkedHashMap<String, String> parameterValues = new LinkedHashMap<>();
final BufferedReader reader = aRequest.getReader();
final String queryString = IOUtils.toString(reader);

final String[] parameterValuePairs = queryString.split("&");

for (String parameterValuePair : parameterValuePairs) {
    final String[] nameValueArray = parameterValuePair.split("=");
    parameterValues.put(nameValueArray[0], nameValueArray[1]);
}

现在parameterValues是一个地图,其中的条目按照出现顺序排序。