Servlet如何在重定向时携带响应体数据?
问题分析与解决方案
为什么两种写法都无法携带响应体?
- 第一种写法:先调用
response.sendRedirect(url)时,Servlet容器会立即设置302状态码、添加Location响应头,并提交响应的头部信息。后续获取Writer写入的内容,会因为响应已经被提交而被容器忽略,根本不会发送给客户端。 - 第二种写法:先写入响应体,但调用
response.sendRedirect(url)时,容器会自动重置整个响应(包括已写入的内容),重新设置302状态和Location头,所以之前写的内容会被清空,客户端自然拿不到。
sendRedirect是Servlet容器提供的快捷方法,它的设计逻辑就是帮你快速完成重定向的标准流程,会自动处理响应的状态、头部和内容重置,所以用它的话没法自定义携带响应体。
正确实现方式
要手动构建302响应,自己控制状态码、响应头和响应体,代码示例:
// 设置302状态码 response.setStatus(HttpServletResponse.SC_FOUND); // 设置重定向的Location头 response.setHeader("Location", url); // 写入响应体 Writer writer = response.getWriter(); writer.write("some message"); writer.close();
这样就能让客户端同时接收到302重定向响应和对应的响应体内容。
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

