【问题标题】:How to avoid interference of HttpServletRequest.getReader and getParameterValues?如何避免 HttpServletRequest.getReader 和 getParameterValues 的干扰?
【发布时间】:2013-10-07 18:04:19
【问题描述】:

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

例如,如果发送者发出以下请求,

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 for ever 参数名称。

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

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

我尝试了以下方法:

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

这些都没有帮助。

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

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    使用第一种方法,您不需要使用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 是一个按出现顺序排列条目的映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2015-07-29
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多