Spring Cloud Gateway自定义重定向过滤器失效问题求助
解决Spring Cloud Gateway重定向到User服务登录页404问题
核心排查方向及解决方法
1. 检查Gateway是否配置了User服务的路由规则
网关必须有转发/user/**路径到User服务的路由,否则重定向的请求会被当成网关自身的接口,直接返回404。
示例正确配置(application.yml):
spring: cloud: gateway: routes: # User服务路由 - id: user-service-route uri: http://localhost:8082 predicates: - Path=/user/** # Order服务路由(挂载认证过滤器) - id: order-service-route uri: http://localhost:8083 predicates: - Path=/order/** filters: - name: UserAuthenticationFilter
2. 修正重定向地址的写法
自定义过滤器里不要直接写User服务的直连地址(如http://localhost:8082/user/loginPage),应该使用网关能识别的相对路径,让网关自动转发请求到User服务。
示例过滤器重定向代码:
public class UserAuthenticationFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 检查Cookie有效性逻辑 boolean hasValidCookie = checkValidCookie(exchange.getRequest().getCookies()); if (!hasValidCookie) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.TEMPORARY_REDIRECT); // 使用网关路由路径,而非直连User服务地址 response.getHeaders().setLocation(URI.create("/user/loginPage")); return response.setComplete(); } return chain.filter(exchange); } private boolean checkValidCookie(MultiValueMap<String, Cookie> cookies) { // 你的Cookie校验逻辑实现 return false; } }
3. 确认User服务的/loginPage接口正常
- 检查User服务中接口的路径、请求方式是否完全匹配,比如控制器代码:
@RestController public class UserController { // 确保路径是/user/loginPage,请求方式为GET(重定向默认发起GET请求) @GetMapping("/user/loginPage") public String showLoginPage() { return "请先登录系统"; } }
- 排查User服务是否有拦截器、Spring Security等拦截了该接口,确保接口能被外部直接访问。
4. 调整过滤器的执行顺序
自定义认证过滤器要在网关的路由匹配过滤器之前执行,否则可能还没匹配到User服务路由就发起了重定向,导致路径无法转发。通过Ordered接口指定优先级:
public class UserAuthenticationFilter implements GatewayFilter, Ordered { // ... 其他代码实现 @Override public int getOrder() { return -1; // 优先级高于默认路由过滤器(默认路由过滤器order为0) } }
验证流程
- 先直接访问
http://localhost:8080/user/loginPage,确认能返回User服务的响应,验证网关路由和User服务接口是否正常。 - 再测试无有效Cookie时访问受保护路由(如
/order/create),看是否能正确重定向到登录页。
内容的提问来源于stack exchange,提问作者Angelo pio Pompeo
相关产品推荐
相关产品推荐

