HttpServletRequest参数小写

时间:2012-01-23 09:05:01

标签: servlets spring-mvc

关注RequestParam value in spring MVC to be case insensitive后,我在方法中添加了HttpServletRequest参数。但我添加了近20个IF条件,以获得完整的不区分大小写的URL。

我知道这是完全痛苦和丑陋的编码方式。我请求任何人给出一个惊人的解决方案。

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

我无法直接以request.getParamter ("orgID")的方式执行此操作。为此,我添加了许多条件。 :-(正如我所说,完全难看的编码。

6 个答案:

答案 0 :(得分: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。那你会做什么?

答案 1 :(得分:2)

虽然这个概念是错误的(在不同情况下获取params并不好),但以下代码片段有效:

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;
}

答案 2 :(得分:1)

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

类似于:如果请求中的参数名称以“id”结尾,无论哪种情况(除了“Id”除外)都比参数更新,复制它并将其添加到名称“xxxId”。

然后您只需要检查请求方法的规范化表单。

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

答案 3 :(得分:0)

您应该使用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;
}

答案 4 :(得分:0)

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

    byte[] res ={-2,-1,0,114,0,101,0,115,0,117,0,108,0,116,0,13,0,10,0,73,0,32,0,108,0,111,0,118,0,101,0,32,0,73,0,110,0,100,0,105,0,97,0,43,0,52,0,51};
InputStream isr = new BufferedInputStream(new ByteArrayInputStream(res));
String mimeType = URLConnection.guessContentTypeFromStream(isr);
System.out.println(mimeType);

答案 5 :(得分:0)

如果您有权访问Java 8:

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