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

新手上路,请多包涵

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

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

原文由 Ashish Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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

控制器(你的 servlet)

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

查看(您的 JSP)

使用小脚本:

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

这仅供 参考必须避免 使用 Scriptlet: 如何避免 JSP 文件中的 Java 代码? .下面是使用 EL 和 JSTL 的示例。

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

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

控制器

   //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" />

原文由 Luiggi Mendoza 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 AllTooSir 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题