拦截器在 Spring Boot GraphQL 中不起作用

Posted

技术标签:

【中文标题】拦截器在 Spring Boot GraphQL 中不起作用【英文标题】:Interceptor not working in Spring Boot GraphQL 【发布时间】:2021-11-05 02:32:08 【问题描述】:

我正在使用 graphql-java-kickstart/graphql-spring-boot,我想创建一个拦截器以在处理请求后添加一个 HTTP 标头。

当我向后端发送 graphql 请求时,不会触发拦截器。但是有些调用会触发拦截器。例如,当我在浏览器中打开 /graphiql 时,我看到拦截器被触发,但是当我从 graphiql 客户端发送一个 graphql 请求时,它不是。知道为什么吗?有人有这方面的经验吗?

我的配置如下所示:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer 

    @Autowired
    private TestInterceptor testInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        registry.addInterceptor(testInterceptor).addPathPatterns("/**");
    

也是我的拦截器:

@Slf4j
@Component
public class TestInterceptor extends HandlerInterceptorAdapter 

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception 
        // post processing
        log.info("hello there");
    


【问题讨论】:

github.com/graphql-java-kickstart/graphql-spring-boot/issues/… 感谢链接我也发现了这个问题。一位贡献者说“......我会说这些拦截器的正确配置应该可以工作......”但所有的 cmets 都是关于 ServletListeners 和 Filters 的,它们不会为我完成任务。 听起来可能与您的模式中的路径有关。您可以尝试使用相同的路径从客户端发送请求吗? 【参考方案1】:

我有以下拦截器在我的项目中成功运行:

    我的网络配置:
@Configuration
public class WebConfig implements WebMvcConfigurer 
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        registry.addInterceptor(requestInterceptor);
    
    
    @Autowired
    private ControllerExecInterceptor requestInterceptor;

其中ControllerExecInterceptor定义为:

@Component
public class ControllerExecInterceptor extends HandlerInterceptorAdapter 
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws AccessDeniedException, Exception 
        // ...
    

    @Override
    public boolean postHandle(HttpServletRequest request, HttpServletResponse 
                            response, Object handler) throws 
        // ...
    

【讨论】:

是 graphql API 还是 REST? 此配置适用于 REST,但您可以使用 GraphQL 看起来它也适用于 GraphQL。谢谢。

以上是关于拦截器在 Spring Boot GraphQL 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot graphql 在类路径中找不到 graphql 模式文件

graphql-spring-boot 上传二进制文件

GraphQL + Spring Boot:如何收集(错误)指标?

有没有办法使用spring boot starter app graphql-spring-boot-starter公开2个graphql端点?

graphql-spring-boot-starter 只有 websockets 的应用程序

使用 graphql-java-tools 和 graphql-spring-boot-starter 处理错误