【问题标题】:HttpServletRequest parameter lowercaseHttpServletRequest 参数小写
【发布时间】:2012-01-23 09:05:00
【问题描述】:

在关注this question 之后,我在我的方法中添加了HttpServletRequest 参数。但是我添加了近 20 个 IF 条件来获得完整的不区分大小写的 URL。

我知道,这是一种非常痛苦且丑陋的编码方式。我请求任何人为此提供一个惊人的解决方案。

我需要一个不区分大小写的请求参数。发送的请求参数是orgID。这个参数将以不同的方式出现。例如。 OrgidoRgidorGidorgID……等等

我不能以request.getParamter ("orgID") 的身份直接执行此操作。为此,我添加了许多 if 条件。 :-( 正如我所说,完全丑陋的编码。

【问题讨论】:

    标签: servlets spring-mvc


    【解决方案1】:

    虽然这个概念是错误的(在不同情况下获取参数并不好),但以下代码 sn-p 有效:

    String getCaseInsensitiveParameter(HttpServletRequest request){
    Map params = request.getParameterMap();
        Iterator i = params.keySet().iterator();
        while ( i.hasNext() )
          {
            String key = (String) i.next();
            String value = ((String[]) params.get( key ))[ 0 ];
            if ("orgid".equals(key.toLowerCase()) {
                return value;
            }
          }
    return null;
    }
    

    【讨论】:

    • 或者,您可以使用 "".equalsIgnoreCase() 让正则表达式进行测试,而不会产生显式创建小写副本的成本...
    【解决方案2】:
    private String getCaseInsensitiveOrgIdParameter(HttpServletRequest request) {
        for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
            String paramName = entry.getKey();
            if ("orgid".equals(paramName.toLowerCase()) {
                return entry.getValue()[0];
            }
        }
        return null;
    }
    

    但我仍然坚持我的立场:发送此参数的其他应用程序是应该修复的。如果参数是orgId,他们应该发送orgId。不是orGid 或其他任何东西。如果他们懒惰(或愚蠢)发送orGid 而不是orgId,则没有任何保证他们不会发送ogrId。那你会怎么做呢?

    【讨论】:

    • 非常感谢 JB。非常好的解决方案。它的工作。现在来回答你的问题 //如果他们足够懒惰(或愚蠢)发送 orGid 而不是 orgId,那么没有任何东西可以保证他们不会发送 ogrId。那你会怎么做呢?// .我会放好文件然后逃离我的公司。设计已经有点怪了,我个人觉得
    • 如上所述,使用 "".equalsIgnoreCase() 而不是显式创建 .toLowerCase() 副本。
    【解决方案3】:

    您可以有一个 Spring MVC 处理程序拦截器 (org.springframework.web.servlet Interface HandlerInterceptor),它采用参数名称并将其“转换”为标准化名称。

    类似:如果请求中的参数名称以“id”结尾,无论哪种情况(除了完全“Id”),都将获取参数,将其复制并添加到名称“xxxId”下。

    那么您只需要检查请求方法中的规范化表单。

    @See:有关 Handler 拦截器的快速介绍:this blog注意最后一个代码块是一个改进的想法,它不起作用

    【讨论】:

      【解决方案4】:

      您应该使用equalsIgnoreCase 方法:

      public String getRequestParameter(HttpServletRequest request, String parameter){
          for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
              if(entry.getKey().equalsIgnoreCase(parameter)){
                  return entry.getValue()[0];
              }
          }
          return null;
      }
      

      或者如果您将请求作为实例变量:

      public String getRequestParameter(String parameter){
          for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
              if(entry.getKey().equalsIgnoreCase(parameter)){
                  return entry.getValue()[0];
              }
          }
          return null;
      }
      

      【讨论】:

        【解决方案5】:

        我的解决方案:只需创建一个新的 params 映射对象,并用小写键填充它。然后使用此参数映射而不是原始对象。然后你可以要求小写的密钥。我是这样做的(使用 Apache Wicket 的 PageParameters 类):

        Map paramsOriginal = request.getParameterMap();
        PageParameters paramsNew = new PageParameters();
        Iterator<String> i = paramsOriginal.keySet().iterator();
        while(i.hasNext()) {
            String key = (String) i.next();
            String value = ((String[]) paramsOriginal.get(key))[0];
            //lowercase the key
            paramsNew.put(key.toLowerCase(), value);
        }
        
        //request the value of a lowercased key
        String orgid = paramsNew.getString("orgid");
        

        【讨论】:

          【解决方案6】:

          如果您可以访问 Java 8:

          request.getParameterMap().stream()
              .collect(Collectors.toMap(e -> e.getKey().toLowerCase(), e.getValue()))
              .get("orgID");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-13
            • 2017-03-21
            • 2023-04-02
            相关资源
            最近更新 更多