我遇到了
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
这是测试截图:
编辑:这是 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);
}
}
}
}
}
不,
HttpServletRequest
不会忽略重复的标头 - 它会收集它们。
HttpServletRequest.getHeaders(String)
以 String 对象的枚举形式返回指定请求标头的所有值。
某些标头(例如 Accept-Language)可以由客户端作为多个标头发送,每个标头具有不同的值,而不是作为逗号分隔列表发送标头。
getHeaderNames()
来检索所有存在的标头,然后使用每个名称调用 getHeaders(String)
,并查看返回的枚举是否有多个条目。
你的增量放错了地方。
HttpServletRequest
将所有值收集在一起并将它们呈现为单个标头的多个值。您应该在循环值的内部循环中测试并递增 headerChecker
。外循环只会遇到 'abcd' 一次。
获取标头名称后进行内部循环。
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
Enumeration<String> headerValues = request.getHeaders(headerName);
List<String> values = new ArrayList<>();
// This will give you multiple values on the same key.
while (headerValues.hasMoreElements()){
values.add(headerValues.nextElement());
}
headers.put(headerName, values);
}