【问题标题】:Remove Header value from HttpServletRequest [duplicate]从 HttpServletRequest 中删除 Header 值 [重复]
【发布时间】:2016-07-21 07:14:41
【问题描述】:

我编写了一个 Web 服务并以 HttpServletRequest Object 的形式获取请求,然后我发送所有标头进行基本验证,例如检查 Blanks 或 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&lt;String&gt; .
但在某些 web 服务中,我想跳过验证,因为上面的代码是在其他一些类中编写的,我想保持它的完整性,并希望在调用方完成更改。

例如
如果我想跳过对名为“content-type”的标头的验证,那么当我这样做时request.removeAttribute("content-type"); 它不会删除标头属性,所以我更进一步想从Enumeration&lt;String&gt; headerNames 中删除它 但是enumeration doesn't allow us to remove any element
有谁知道如何从HttpServletRequest Object 的标头参数中删除元素。

【问题讨论】:

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


    【解决方案1】:

    Attribute、Parameter 和 Header,这三者在 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();,您可以在其中返回另一个仅添加所需标头的枚举。

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

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

    【讨论】:

    • 不,实际上只有一些调用者我想跳过验证,因此我已经询问了从调用者端删除标题的方法,我想我必须用Adapter 模式编写一个类,其中Iterator 可以是目标Enumeration 可以是Adaptee
    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 2014-03-25
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多