Java 从HttpServletRequest中删除头值

Java 从HttpServletRequest中删除头值,java,web-services,validation,servlets,http-headers,Java,Web Services,Validation,Servlets,Http Headers,我已经编写了一个web服务,并以HttpServletRequest对象的形式获取请求,然后发送所有头进行基本验证,如检查空格或null等 public void validateHeader(HttpServletRequest request) Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String

我已经编写了一个web服务,并以
HttpServletRequest
对象的形式获取请求,然后发送所有头进行基本验证,如检查空格或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);         
    }
}
public void validateHeader(HttpServletRequest)
枚举headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
字符串键=(字符串)headerNames.nextElement();
字符串值=request.getHeader(键);
genericHeaderValidator(键、值);
}
}
正如您可以看到的
request.getHeaderNames()返回
枚举
.
但在某些Web服务中,我想跳过验证,因为上面的代码是在其他类中编写的,我想保持它的完整性,并希望更改在调用方完成。

例如
如果我想跳过名为“content type”的标题的验证,那么当我执行
request.removeAttribute(“content type”);
它没有删除header属性,因此我进一步考虑将其从
枚举headerNames
但是

是否有人知道如何从
HttpServletRequest
对象的头参数中删除元素。

属性、参数和头,这三者在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);         
            }
        }
 }
public void validateHeader(HttpServletRequest请求,设置headersToBeIgnored){
枚举headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
字符串键=(字符串)headerNames.nextElement();
如果(!headersToBeIgnored.contains)(键){
字符串值=request.getHeader(键);
genericHeaderValidator(键、值);
}
}
}
因此,在这里,您可以从调用方传递不需要验证的头集。在头上循环时,只需检查头是否包含在
headersToBeIgnored
中,然后不验证它

选项3:扩展HttpServletRequestWrapper

正如您所说,您需要从调用者端删除标题,此处接受的答案()正好满足您的目的。您可以扩展
HttpServletRequestWrapper
并覆盖
getHeaderNames();
,在其中您可以返回另一个只添加了所需标题的枚举

但是,对于从不同的调用者返回的每一组不同的报头,您需要有一个单独的实现。因此,如果您不需要有许多不同的调用者,这应该是很好的


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

属性、参数和头,这三个在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);         
            }
        }
 }
public void validateHeader(HttpServletRequest请求,设置headersToBeIgnored){
枚举headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
字符串键=(字符串)headerNames.nextElement();
如果(!headersToBeIgnored.contains)(键){
字符串值=request.getHeader(键);
genericHeaderValidator(键、值);
}
}
}
因此,在这里,您可以从调用方传递不需要验证的头集。在头上循环时,只需检查头是否包含在
headersToBeIgnored
中,然后不验证它

选项3:扩展HttpServletRequestWrapper

正如您所说,您需要从调用者端删除标题,此处接受的答案()正好满足您的目的。您可以扩展
HttpServletRequestWrapper
并覆盖
getHeaderNames();
,在其中您可以返回另一个只添加了所需标题的枚举

但是,对于从不同的调用者返回的每一组不同的报头,您需要有一个单独的实现。因此,如果您不需要有许多不同的调用者,这应该是很好的


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

No实际上,对于一些调用方,我想跳过验证,因此我问了如何从调用方端删除头,我想我必须使用
Adapter
模式编写一个类,其中
迭代器可以作为目标,
枚举
可以作为目标dapteeNo实际上,对于一些调用方,我想跳过验证,因此我已经询问了如何从调用方端删除头,我想我必须使用
适配器
模式编写一个类,其中
迭代器
可以作为目标,而
枚举
可以被改编