属性,参数和标题,这两者在HttpRequest的上下文中是不同的。因此,request.removeAttribute("xyz");将删除请求中名为xyz的属性,而不是标头。据我所知,你不能像那样删除或修改标题。
以下是我能想到达到目的的不同方式。
选项1:当要忽略的标头是常量时
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
if(!key.equals("content-type") {
String value = request.getHeader(key);
genericHeaderValidator(key, value);
}
}
}
选项2:当验证者忽略要忽略的标题时(由您的情况决定)。传递一组不需要验证的标题:
public void validateHeader(HttpServletRequest request, Set headersToBeIgnored) {
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
if(!headersToBeIgnored.contains(key){
String value = request.getHeader(key);
genericHeaderValidator(key, value);
}
}
}
因此,您可以在此处传递来自呼叫方的标头集,这些标头不会被验证。在循环标题时,只需检查标题是否包含在headersToBeIgnored中,然后不验证它。
选项3:扩展HttpServletRequestWrapper
正如您所说,您需要从来电方删除标题,此处接受的答案(Adding an HTTP Header to the request in a servlet filter)完全符合您的目的。您可以扩展HttpServletRequestWrapper并覆盖getHeaderNames();,其中您可以返回另一个枚举,只添加了必需的标题。
但是,对于要从不同调用方返回的每个不同的标头集,您需要具有单独的实现。所以,如果您不需要许多不同的呼叫者,这应该没问题。
在上面的答案中,您需要删除而不是添加。