在拦截器 Spring Boot 上添加自定义标头

问题描述 投票:0回答:2

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

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 上的请求添加自定义标头方法,然后将请求发送到控制器。有人可以帮我吗?

java spring spring-boot controller jvm
2个回答
8
投票

HttpServletRequest
对象是只读的,您无法在
HandlerInterceptor
中修改其标头。您可以用它做的唯一一件事是设置属性并稍后在控制器中读取它们。

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

有一种方法可以做到这一点 - 就是使用

Filter
,您可以在其中用您自己的请求包装器实现替换传入的请求对象。通过使用请求包装器,您可以根据需要修改其标头列表。

有一个很好的教程解释了如何操作。

下面是基于本教程的示例,根据您的用例稍作调整:

@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的实现:

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); } }
    

0
投票
我在上面添加了相同的代码,但在控制器中 @RequestHeader 不读取自定义标头,但如果我在像 request.getHeader("xxx") 这样的控制器中获取它,那么它会返回自定义标头。你能帮助我如何让控制器中的@RequestHeader读取自定义标头吗?

© www.soinside.com 2019 - 2024. All rights reserved.