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

2022-09-01 15:23:39

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

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

答案 1

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

  1. 使用转发。这将使请求属性可以传递到视图,并且您可以以ServletRequest#getAttribute的形式使用它们,或者通过使用表达式语言JSTL。简短的示例(重用TheNewIdiot的答案]代码)。

    控制器(您的 servlet)

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

    视图(您的 JSP)

    使用脚本:

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

    仅供参考。必须避免使用脚本:如何避免在 JSP 文件中使用 Java 代码?下面是使用 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");
    

    视图

    同样,使用脚本小工具,然后 EL + JSTL 来显示这一点:

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

答案 2

通常,您不能使用 sendRedirect() 方法发送 POST 请求。您可以使用 RequestDispatcher 在同一 Web 应用程序、同一上下文中转发具有参数的请求。

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

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