【问题标题】:Add custom header on interceptor spring boot在拦截器弹簧引导上添加自定义标头
【发布时间】:2021-11-19 14:45:36
【问题描述】:

我有一个拦截器,我需要添加代码其他部分所需的自定义标头

public class KeyTaskInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

    if (// a custom condition) {
        request.  // set custom header key ... `KeyCode`
    }
    return true;
} 

问题是前端没有发送这个名为“KeyCode”的自定义标头,我无法更改期望此标头的控制器的实现,因此我必须找到一种方法来根据请求添加自定义标头在将请求发送到控制器之前在 preHandle 方法上。有人可以帮帮我吗?

【问题讨论】:

  • 您可能需要检查:response docsheader docs
  • @skubski 我检查了但没有任何效果,我想获取标题并添加一个新标题并更新标题,但没有可用的方法

标签: java spring spring-boot controller jvm


【解决方案1】:

HttpServletRequest 对象是只读的,您不能在HandlerInterceptor 中修改其标题。你唯一能做的就是set attributes然后在你的控制器中阅读它们。

但在您的情况下,您无法更改控制器的实现以读取属性,您实际上需要修改请求标头。

有一种方法可以做到这一点 - 是使用Filter,您将在其中将传入的请求对象替换为您自己的请求包装器实现。通过使用请求包装器,您可以根据需要修改其标头列表。

a good tutorial 解释了如何操作。

以下是基于本教程的示例,略微适合您的用例:

@Component
public class CustomHeaderFilter implements Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest((HttpServletRequest) request);
    mutableRequest.putHeader("KeyCode", "custom value");
    chain.doFilter(mutableRequest, response);
  }
}

以及MutableHttpServletRequest的实现来自the tutorial

class MutableHttpServletRequest extends HttpServletRequestWrapper {
    // holds custom header and value mapping
    private final Map<String, String> customHeaders;
 
    public MutableHttpServletRequest(HttpServletRequest request){
        super(request);
        this.customHeaders = new HashMap<String, String>();
    }
    
    public void putHeader(String name, String value){
        this.customHeaders.put(name, value);
    }
 
    public String getHeader(String name) {
        // check the custom headers first
        String headerValue = customHeaders.get(name);
        
        if (headerValue != null){
            return headerValue;
        }
        // else return from into the original wrapped object
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }
 
    public Enumeration<String> getHeaderNames() {
        // create a set of the custom header names
        Set<String> set = new HashSet<String>(customHeaders.keySet());
        
        // now add the headers from the wrapped request object
        @SuppressWarnings("unchecked")
        Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (e.hasMoreElements()) {
            // add the names of the request headers into the list
            String n = e.nextElement();
            set.add(n);
        }
 
        // create an enumeration from the set and return
        return Collections.enumeration(set);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 2019-09-19
    • 1970-01-01
    • 2018-01-31
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多