从HttpServletRequest中删除Header值

时间:2016-04-01 12:59:32

标签: java web-services validation servlets http-headers

我已经编写了一个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对象的标题参数中删除元素。

1 个答案:

答案 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();,其中您可以返回另一个枚举,只添加了必需的标题。

但是,对于要从不同调用方返回的每个不同的标头集,您需要具有单独的实现。所以,如果您不需要许多不同的呼叫者,这应该没问题。

在上面的答案中,您需要删除而不是添加。