使用 response.sendRedirect() 传递隐藏参数

Posted

技术标签:

【中文标题】使用 response.sendRedirect() 传递隐藏参数【英文标题】:Pass Hidden parameters using response.sendRedirect() 【发布时间】:2013-06-04 18:27:31 【问题描述】:

如何传递隐藏参数?我想调用一个页面(test.jsp),但也传递 2 个隐藏参数,如帖子。

response.sendRedirect("/content/test.jsp");

【问题讨论】:

@informatik01 我的回答涵盖了你在你的回答中所涵盖的内容,除了我添加了使用 JSTL 删除会话属性的视图部分。 @LuiggiMendoza 对不起,伙计,我会删除我的评论以确保你没事。顺便说一句,这个答案是在大约 5 个月前发布的) @informatik01 不知道您的帖子,但看起来我们都知道(以及世界各地的其他人)如何处理这个问题。 【参考方案1】:

使用这个:

out.println("<script>window.location.href = \"hoadon?OrderId=" + getIdOrder + "\"\n</script>>");

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。【参考方案2】:

在 response.sendRedirect() 中通过 URL 发送变量值。我已经将它用于一个变量,您也可以通过适当的连接将它用于两个变量。

字符串值="xyz";

response.sendRedirect("/content/test.jsp?var="+value);

【讨论】:

【参考方案3】:

使用session,我成功地将参数(name)从servlet #1 传递到servlet #2,在servlet #1 中使用response.sendRedirect。 Servlet #1 代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    String name = request.getParameter("name");
    String password = request.getParameter("password");
    ...
    request.getSession().setAttribute("name", name);
    response.sendRedirect("/todo.do");

在 Servlet #2 中,您不需要返回 name。它已经连接到会话。你可以这样做 String name = (String) request.getSession().getAttribute("name"); ---但你不需要这个。

如果 Servlet #2 调用了一个 JSP,你可以在 JSP 网页上这样显示name

&lt;h1&gt;Welcome $name&lt;/h1&gt;

【讨论】:

【参考方案4】:

TheNewIdiot's answer 成功解释了问题以及无法通过重定向在请求中发送属性的原因。可能的解决方案:

    使用转发。这将使请求属性可以传递给视图,您可以以ServletRequest#getAttribute 或Expression Language 和JSTL 的形式使用它们。简短示例(重用 TheNewIdiot 的答案] 代码)。

    控制器(您的 servlet)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    查看(您的 JSP)

    使用小脚本:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    这仅用于信息目的必须避免使用小脚本:How to avoid Java code in JSP files?。下面是使用EL和JSTL的例子。

    <c:out value="$message" />
    

    如果你不能使用转发(因为你不喜欢它,或者你不这么觉得,或者因为你必须使用重定向),那么一个选项是将消息保存为会话属性,然后重定向到您的视图中,恢复您视图中的会话属性并从会话中将其删除。请记住始终让您的用户会话只包含相关数据。代码示例

    控制器

    //if request is not from HttpServletRequest, you should do a typecast before
    HttpSession session = request.getSession(false);
    //save message in session
    session.setAttribute("helloWorld", "Hello world");
    response.sendRedirect("/content/test.jsp");
    

    查看

    再次,使用 scriptlet 和 EL + JSTL 来展示这一点:

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="$sessionScope.message" />
    <c:remove var="message" scope="session" />
    

【讨论】:

【参考方案5】:

一般情况下,您不能使用sendRedirect() 方法发送 POST 请求。您可以在同一 Web 应用程序、同一上下文中使用带有参数的 RequestDispatcher 到 forward() 请求。

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

HTTP 规范规定所有重定向都必须采用 GET(或 HEAD)的形式。 如果安全是一个问题,您可以考虑加密您的查询字符串参数。 另一种方法是您可以通过使用 POST 方法的隐藏表单并在页面加载时使用 javascript 提交来向目标 POST。

【讨论】:

@AshishAnand 查看我编辑的答案,您可以在同一个网络应用程序中使用RequestDispatcher 应该是getServletContext().getRequestDispatcher(...)?

以上是关于使用 response.sendRedirect() 传递隐藏参数的主要内容,如果未能解决你的问题,请参考以下文章

response.sendredirect为啥跳转不了

我遇到的response.sendRedirect跳转不了问题

无法使用 response.sendRedirect 重定向

404 与 response.sendRedirect

response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]

response.sendRedirect - 检查重定向是不是启动