Spring REST API拦截器在每个请求上添加响应标头



我正在使用基于Spring 4 REST API注释的配置应用程序。我想在用户通过JWT身份验证用户后,在每个请求上添加响应标头。我创建了以下看起来的拦截器:

public class AuthenticateInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3)
        throws Exception {
    response.addHeader("afterCompletion", "afterCompletion header");
    response.setHeader("afterCompletion", "afterCompletion header");
    System.out.println("************** afterCompletion **************");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object,
        ModelAndView modelAndView) throws Exception {
    response.addHeader("postHandle", "postHandle header");
    System.out.println("************** postHandle **************");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
    System.out.println("************** preHandle **************");
    return true;
  }
}

我的拦截器配置如下:

@Configuration
public class AdapterConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new AuthenticateInterceptor());
  }
}

当我获得JSON响应时,我将无法看到从Interceptor添加的添加的标头值。任何人都为我提供什么问题,以及如何为每个请求添加interceptor的标头。

我没有在拦截器中成功,而是使用过滤器或WebFilter完美地工作:

@Component
public class ResponseHeaderWebFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("CustomHeaderName", "SomeValue");
        chain.doFilter(request, response);
    }
}

如果您使用的是WebFlux反应性组件,则:

@Component
public class ResponseHeaderWebFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        exchange.getResponse()
          .getHeaders()
          .add("CustomHeaderName", "SomeValue");
        return chain.filter(exchange);
    }
}

如果它可以帮助您,我已经这样管理了:https://stackoverflow.com/a/49431665/4939245
看看第二点

您可以将响应标头放在应用程序中调用(这是基于春季注释的(:

@Component
public class Filter extends OncePerRequestFilter {
....
 @Override
 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    //response.addHeader("Access-Control-Allow-Origin", "*");
    //response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies.
    filterChain.doFilter(request, response);
 }
}

我希望我有帮助!

您几乎在做同样的事情,但想为您带来合意的实现方式。请进行以下更改。

1(在AuthenticateInterceptor类上添加@component注释。并且您的包装包含此类应在包装扫描列表中。

@Component
public class AuthenticateInterceptor implements HandlerInterceptor {
 ...
}

2(autowire和AuthenticateInterceptor的自动式实例如下。

@Configuration
public class AdapterConfig extends WebMvcConfigurerAdapter {
@Autowired
private AuthenticateInterceptor authenticateInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticateInterceptor);
  }
}

最新更新