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

时间:2013-06-08 15:47:27

标签: java jsp servlets post url-parameters

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

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

4 个答案:

答案 0 :(得分:44)

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

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

    控制器(您的servlet)

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

    查看(您的JSP)

    使用scriptlet:

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

    这仅用于信息目的。必须避免使用的Scriptlet 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" />
    

答案 1 :(得分:4)

通常,您无法使用sendRedirect()方法发送POST请求。您可以在同一个Web应用程序中使用RequestDispatcher forward()个{{3}}个请求,相同的上下文。

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

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

答案 2 :(得分:0)

使用session,我使用servlet#1中的name成功地将参数(response.sendRedirect)从servlet#1传递到servlet#2。 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>

答案 3 :(得分:-1)

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

String value =“ xyz”;

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