首页 > 解决方案 > 如何在 HandlerInterceptor 中更改 HttpServletRequest 的标头值?

问题描述

所以如下我必须更改(覆盖)请求中一个标头的值。我有实现 HandlerInterceptor 的自定义拦截器。我尝试过使用 HttpServletRequestWrapper,我已经覆盖了 getHeader、getHeaders 和 getHeaderNames 方法来返回新值,但它似乎不起作用,或者我使用它的方式错误。有谁知道如何实现这一目标?我真的不想使用过滤器,它只用于一个特定的控制器,而不是每个请求。

所以我尝试过,这里是包装器:

static class RequestHeaderOverwriteWrapper extends HttpServletRequestWrapper {
private final String newHeader;

RequestHeaderOverwriteWrapper(final HttpServletRequest request, final String header) {
    super(request);
    this.newHeader = header;
}

@Override
public String getHeader(final String name) {
    if (newHeader != null && "Header-To-Change".equals(name)) {
        return newHeader;
    }
    return super.getHeader(name);
}

@Override
public Enumeration<String> getHeaders(final String name) {
    if (newHeader != null && "Header-To-Change".equals(name)) {
        return new IteratorEnumeration(Collections.singletonList(newHeader).iterator());
    }
    return super.getHeaders(name);
}

@Override
public Enumeration<String> getHeaderNames() {
    final List<String> headerNames = new ArrayList<>();
    final Enumeration<String> superHeaderNames = super.getHeaderNames();
    while (superHeaderNames.hasMoreElements()) {
        headerNames.add(superHeaderNames.nextElement());
    }
    if (newHeader != null && !headerNames.contains("Header-To-Change")) {
        headerNames.add("Header-To-Change"); //this header needs to be present, its value has to be overridden
    }
    return new IteratorEnumeration(headerNames.iterator());
}

而且我不确定在 Interceptor, preHandle 方法中调用它:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    //here the RequestHeaderOverwriteWrapper has to be used, but what is the correct way to make it work??
    return true;
}

标签: springspring-mvchttp-headershandlerinterceptor

解决方案


这个问题是很久以前提出的,所以如果有人有同样的问题,我会在这里发布答案:你不能做我用拦截器尝试过的事情,他们不能改变现有标题的值,所以你必须使用过滤器和 RequestWrapper 就像我发布的问题一样。


推荐阅读