我已经编写了一个Web服务并以HttpServletRequest
Object的形式获取请求,然后我发送所有标题以进行基本验证,例如检查空白或null 等。
public void validateHeader(HttpServletRequest request)
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
genericHeaderValidator(key, value);
}
}
您可以看到request.getHeaderNames();
返回Enumeration<String>
。但是在某些网络服务中,我想跳过验证,因为上面的代码是在其他一些类中编写的,我希望保持完整,并希望在呼叫方进行更改。
例如,如果我想跳过名为&#34; content-type&#34;的标题的验证。所以,当我request.removeAttribute("content-type");
它没有删除标题属性时,我进一步考虑将其从Enumeration<String> headerNames
中移除
但是enumeration doesn't allow us to remove any element。
是否有人知道如何从HttpServletRequest
对象的标题参数中删除元素。
答案 0 :(得分:0)
属性,参数和标题,这两者在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<String> headersToBeIgnored) {
Enumeration<String> 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();
,其中您可以返回另一个枚举,只添加了必需的标题。
但是,对于要从不同调用方返回的每个不同的标头集,您需要具有单独的实现。所以,如果您不需要许多不同的呼叫者,这应该没问题。
在上面的答案中,您需要删除而不是添加。