You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Servlet的sendRedirect时为何获取到null值?附相关代码

为什么使用sendRedirect时,SecondServlet获取的fname参数为null?

这是因为sendRedirect是客户端跳转,它的工作机制导致原来请求中的参数无法自动传递到新的请求里,我来给你详细拆解原因和解决办法:

核心原因:sendRedirect的工作逻辑

当你在FirstServlet里调用res.sendRedirect("SecondServlet")时,服务器并没有直接把请求转发给SecondServlet,而是给浏览器返回一个302 Found的响应,告诉浏览器:“你去请求这个新的URL(SecondServlet)”。

这时候浏览器会发起一个全新的HTTP GET请求去访问SecondServlet,这个新请求和之前提交表单的请求完全独立——原来表单提交时带的fname参数,不会被自动带到这个新请求里,所以SecondServlet调用request.getParameter("fname")自然就返回null了。

不过你会发现FirstServlet里是能拿到fname的,因为它处理的是表单提交的原始请求,这部分是没问题的。

两种解决办法

办法1:改用服务器端转发(forward)

如果不需要改变浏览器地址栏的URL,推荐用RequestDispatcher.forward(),这是服务器内部跳转,会把原来的request对象直接传递给SecondServlet,参数自然就能保留。

修改FirstServlet的代码,把sendRedirect替换成forward:

public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException {
    String s3 = request.getParameter("fname");
    // 替换sendRedirect为forward
    RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");
    rd.forward(request, res);
    System.out.println("your output as per" + s3);
}

这样SecondServlet就能直接拿到fname参数了,地址栏也会保持原来的FirstServlet URL。

办法2:重定向时手动携带参数

如果必须用重定向(比如需要让浏览器地址栏显示SecondServlet的URL),可以把参数拼在重定向的URL后面:

public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException {
    String s3 = request.getParameter("fname");
    // 手动把参数拼到URL里
    res.sendRedirect("SecondServlet?fname=" + s3);
    System.out.println("your output as per" + s3);
}

⚠️ 注意:如果参数包含中文、空格或特殊字符,一定要用URLEncoder.encode()编码,避免乱码或参数解析错误:

String encodedFname = URLEncoder.encode(s3, "UTF-8");
res.sendRedirect("SecondServlet?fname=" + encodedFname);

这样SecondServlet就能从新的请求URL里拿到fname参数了,地址栏也会显示SecondServlet?fname=xxx。

内容的提问来源于stack exchange,提问作者Siddharth Bhandari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:37