每个Spring Rest API请求都添加响应头的拦截器

3

我正在使用基于注释的配置应用程序与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响应时,我无法看到从拦截器添加的标头值。 有人可以帮我解决问题并说明如何为每个请求从拦截器添加标头吗?

3个回答

2

我在拦截器方面没有成功,而是使用过滤器或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响应式组件,则:

如果您使用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);
    }
}

0
如果可以帮到你,我是这样处理的:https://dev59.com/lKrka4cB1Zd3GeqPXQUH#49431665,看第二点。
你可以在应用程序中为每个调用设置响应头(这适用于基于Spring注释的方式)。
@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);
 }
}

我希望我有所帮助!

提供其他问题/来源的链接可以作为额外参考,但你需要在回答中放入相关信息。 - Michael

0

你已经做得差不多了,但我想给你提供一种更加一致的实现方式。请按照以下步骤进行更改。

1)在AuthenticateInterceptor类上添加@Component注解。并且包含此类的包应该在扫描列表中。

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

2) 自动装配并注入AuthenticateInterceptor的实例,如下所示。

@Configuration
public class AdapterConfig extends WebMvcConfigurerAdapter {

@Autowired
private AuthenticateInterceptor authenticateInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(authenticateInterceptor);
  }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接