Spring Boot GraphQL框架下Interceptor不触发问题咨询
问题原因
- 你使用的Spring MVC
HandlerInterceptor仅能拦截由SpringDispatcherServlet处理的请求,/graphiql页面属于Spring MVC管控的静态资源/跳转接口,所以可以触发拦截。 - graphql-java-kickstart 默认使用独立的
GraphQLServlet处理/graphql端点的查询请求,该Servlet不归Spring MVC DispatcherServlet管理,因此MVC拦截器无法感知到这类请求。
解决方案
方案1:使用Servlet Filter实现响应头添加(最通用,推荐)
Filter是Servlet规范层面的组件,能拦截所有进入应用的HTTP请求,不受后端处理逻辑的限制,代码示例:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(urlPatterns = "/*") @Component public class ResponseHeaderFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 先执行后续请求处理逻辑 chain.doFilter(request, response); // 后置处理阶段添加自定义响应头 httpResponse.addHeader("自定义头名称", "自定义头值"); } }
如果仅需要拦截GraphQL相关请求,修改urlPatterns为/graphql/*即可。
方案2:使用graphql-java-kickstart原生的请求监听器
如果你的逻辑和GraphQL请求的生命周期强绑定,可以直接使用组件提供的GraphQLServletListener,在请求处理前后插入自定义逻辑:
import com.graphql.spring.boot.servlet.GraphQLServletListener; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class CustomGraphQLListener implements GraphQLServletListener { @Override public RequestCallback onRequest(HttpServletRequest request, HttpServletResponse response) { return new RequestCallback() { @Override public void onSuccess(HttpServletRequest request, HttpServletResponse response) { // 请求处理成功后触发,此处添加响应头即可 response.addHeader("自定义头名称", "自定义头值"); } @Override public void onError(HttpServletRequest request, HttpServletResponse response, Throwable throwable) { // 异常场景也可在此处添加统一响应头 } }; } }
方案3:切换为Spring MVC模式处理GraphQL请求
如果你需要复用现有MVC拦截器逻辑,可以修改配置让graphql端点走Spring MVC Controller处理,在application.yml添加如下配置:
graphql: servlet: enabled: false # 关闭默认的独立Servlet spring: web: servlet: enabled: true # 开启Spring MVC模式的GraphQL端点
开启后/graphql端点将由Spring MVC Controller处理,你原来的MVC拦截器配置就可以正常拦截请求了。
内容的提问来源于stack exchange,提问作者LagSurfer
相关产品推荐
相关产品推荐

