Spring Boot中redirect:/path重定向不生效,直接返回对应字符串问题
问题根因
- 你使用了
@RestController注解,该注解自带@ResponseBody语义,所有返回值都会直接作为HTTP响应体序列化输出,不会触发Spring MVC的视图解析逻辑,所以redirect:前缀不会被识别为重定向指令,只会被当做普通字符串返回。 - 你提到项目未使用Spring MVC,而
redirect:前缀的重定向逻辑本身就是Spring MVC的视图解析器提供的能力,没有引入Spring MVC的情况下该特性自然不会生效。
解决方案
方案1:手动实现重定向(仅解决重定向失效问题)
直接注入HttpServletResponse对象,调用Servlet原生的sendRedirect方法手动触发3xx重定向,无需依赖Spring MVC的视图能力,代码示例:
@Override public void getHealthCheck(HttpServletResponse response) throws IOException { response.sendRedirect("/actuator/health"); }
注意:该方案仍然需要客户端访问/actuator/health时拥有权限,无法解决你部署环境下actuator接口返回401的问题。
方案2:直接返回健康检查结果(推荐,可同时解决401问题)
不需要走重定向逻辑,直接在你的可公开访问接口中注入Actuator的HealthEndpoint Bean,服务内部调用获取健康状态后直接返回,绕开端点的权限拦截:
@RestController @Api(value = ConsentConstants.GET_HEALTH_V1, tags = {ConsentConstants.SWAGGER_API}) @Slf4j @FieldDefaults(level = AccessLevel.PRIVATE) @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class GetHealthController implements GetHealthApi { final Tracer tracer; // 注入Actuator健康检查端点Bean final HealthEndpoint healthEndpoint; @Override public Object getHealthCheck() { return healthEndpoint.health(); } }
该方式相当于通过你已验证可正常访问的端点对外暴露健康状态,不需要跳转访问actuator原生端点,也就不会触发401权限校验。
内容的提问来源于stack exchange,提问作者Boommeister
相关产品推荐
相关产品推荐

