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

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

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

【问题讨论】:

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

标签: java jsp servlets post url-parameters


【解决方案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 成功解释了问题以及无法通过重定向在请求中发送属性的原因。可能的解决方案:

      1. 使用转发。这将使请求属性可以传递给视图,您可以以ServletRequest#getAttributeExpression LanguageJSTL 的形式使用它们。简短示例(重用 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}" />
        
      2. 如果你不能使用转发(因为你不喜欢它,或者你不这么觉得,或者因为你必须使用重定向),那么一个选项是将消息保存为会话属性,然后重定向到您的视图中,恢复您视图中的会话属性并从会话中将其删除。请记住始终让您的用户会话只包含相关数据。代码示例

        控制器

        //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 应用程序、同一上下文中使用带有参数的 RequestDispatcherforward() 请求。

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

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

        【讨论】:

        • @AshishAnand 查看我编辑的答案,您可以在同一个网络应用程序中使用RequestDispatcher
        • 应该是getServletContext().getRequestDispatcher(...)?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 2017-11-16
        相关资源
        最近更新 更多