使用 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
:
<h1>Welcome $name</h1>
【讨论】:
【参考方案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() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]