使用HttpServletRequest捕获重复的请求标头

时间:2012-09-29 11:08:25

标签: java servlets tomcat6

我遇到了HttpServlet请求的问题。我有一个应用程序,它将检索请求标头。如果应用程序找到重复的标题名称,则应该抛出错误。但是,经过一段谷歌搜索后,我发现HttpServletRequest忽略了重复的标题名称,并继续获取它遇到的第一个标题名称。有什么办法可以捕获那些重复的请求标题吗?

我正在使用Tomcat 6作为应用程序容器。

这是代码:

int headerChecker=0;
for(Enumeration<String>names = request.getHeaderNames(); names.hasMoreElements(); ) {
    String name = (String)names.nextElement();
    if(name.equalsIgnoreCase("abcd")){
        headerChecker++; // add 1 to headerChecker if abcd header is encountered
    }
    for(Enumeration<String>values = request.getHeaders(name); values.hasMoreElements(); ) {
        String value=(String)values.nextElement();
        System.out.println("name: "+name+"\tvalue: "+value);
        }
    }

    if(headerChecker! = 1){
        logger.error("abcd is duplicated, returning HTTP 404");
    } else {
        //...proceed with application
    }
}

这是日志:

name:  host   value: localhost:8080  name: user-agent value:
CocoaRestClient/8 CFNetwork/520.4.3 Darwin/11.4.2 (x86_64)
(MacBookPro9%2C2)  name: content-length value: 23  name: accept   value:

**name: abcd  value: 1234556**  name: accept-language value: en-us  name: accept-encoding value: gzip, deflate  name: content-type    value:
application/x-www-form-urlencoded  name: connection value: keep-alive

这是测试截图:

enter image description here

编辑:这是servlet

public class HeaderServlet extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse res)
{
    doGet(req, res);
}

public void doGet(HttpServletRequest req, HttpServletResponse res)
{
int xmsisdnChecker = 0;
String value = "";  
for(Enumeration<String> names = req.getHeaderNames();names.hasMoreElements();){
    String name = (String) names.nextElement(); 
    Enumeration<String> values = req.getHeaders(name);
    if(values != null)
    {
        while(values.hasMoreElements()) {
            if(name.equalsIgnoreCase("abcd"))
            {
                xmsisdnChecker++;
                System.out.println("ee: " + xmsisdnChecker) ;
            }

            value = (String) values.nextElement();

            System.out.println("header name: " + name + "\theader value: " + value);
        }

    }   
  }
}   
}

2 个答案:

答案 0 :(得分:6)

不,HttpServletRequest忽略重复标题 - 它会收集它们。

来自HttpServletRequest.getHeaders(String)

  

将指定请求标头的所有值作为String对象的枚举返回。

     

某些标头(例如Accept-Language)可以由客户端发送为多个标头,每个标头具有不同的值,而不是将标头作为逗号分隔列表发送。

因此,您只需要调用getHeaderNames()来检索所有存在的标头,然后使用每个名称调用getHeaders(String),并查看返回的枚举是否包含多个条目。

答案 1 :(得分:1)

您的增量位置错误。 HttpServletRequest将所有值收集在一起,并将它们显示为单个标头的多个值。您应该在循环遍历值的内循环内测试并递增headerChecker。外环只会遇到'abcd'一次。