Spring MVC函数式端点重定向时,如何实现Flash属性功能?
Spring MVC函数式端点实现重定向单次会话属性(Flash属性)
传统Spring MVC里,RedirectAttributes能轻松添加仅在下次重定向请求中有效的Flash属性,但Spring MVC函数式端点目前没有原生支持该特性。不过我们可以基于ServerRequest的会话功能手动模拟实现:
手动模拟Flash属性逻辑
1. 重定向端点存入Flash属性
import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; import static org.springframework.web.servlet.function.ServerResponse.redirect; public ServerResponse redirectWithFlash(ServerRequest request) { // 获取会话(不存在则创建) request.session().ifPresent(session -> { // 添加Flash属性,可自定义前缀区分普通会话属性 session.setAttribute("FLASH_MESSAGE", "操作成功"); }); // 重定向到目标端点 return redirect("/target-endpoint").build(); }
2. 目标端点读取并清除Flash属性
public ServerResponse handleTarget(ServerRequest request) { String flashMessage = null; // 读取并移除Flash属性 request.session().ifPresent(session -> { flashMessage = (String) session.getAttribute("FLASH_MESSAGE"); if (flashMessage != null) { session.removeAttribute("FLASH_MESSAGE"); } }); // 使用flashMessage渲染视图或返回响应 return ServerResponse.ok().body("Flash Message: " + (flashMessage != null ? flashMessage : "None")); }
封装工具类简化操作
为避免重复代码,可封装工具类统一处理Flash属性:
import org.springframework.web.servlet.function.ServerRequest; import jakarta.servlet.http.HttpSession; import java.util.Optional; public class FlashAttributes { private static final String FLASH_PREFIX = "FLASH_"; public static void addFlashAttribute(ServerRequest request, String name, Object value) { request.session().ifPresent(session -> session.setAttribute(FLASH_PREFIX + name, value) ); } public static <T> Optional<T> getFlashAttribute(ServerRequest request, String name, Class<T> type) { return request.session() .map(session -> { Object attribute = session.getAttribute(FLASH_PREFIX + name); if (attribute != null) { session.removeAttribute(FLASH_PREFIX + name); return type.cast(attribute); } return null; }); } }
工具类使用示例:
// 重定向端点 public ServerResponse redirectWithFlash(ServerRequest request) { FlashAttributes.addFlashAttribute(request, "message", "操作成功"); return redirect("/target-endpoint").build(); } // 目标端点 public ServerResponse handleTarget(ServerRequest request) { String message = FlashAttributes.getFlashAttribute(request, "message", String.class) .orElse("无消息"); return ServerResponse.ok().body(message); }
该方案核心是利用HttpSession存储属性,在目标请求处理完成后立即移除,实现和原生Flash属性一致的“仅下次重定向有效”效果。
内容的提问来源于stack exchange,提问作者benzen
相关产品推荐
相关产品推荐

