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

Ash*_*and 26 java post jsp servlets url-parameters

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

response.sendRedirect("/content/test.jsp");
Run Code Online (Sandbox Code Playgroud)

Lui*_*oza 46

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

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

    控制器(你的servlet)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    
    Run Code Online (Sandbox Code Playgroud)

    查看(您的JSP)

    使用scriptlet:

    <%
        out.println(request.getAttribute("message"));
    %>
    
    Run Code Online (Sandbox Code Playgroud)

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

    <c:out value="${message}" />
    
    Run Code Online (Sandbox Code Playgroud)
  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");
    
    Run Code Online (Sandbox Code Playgroud)

    视图

    再次,使用scriptlet然后使用EL + JSTL显示:

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


NIN*_*OOP 5

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

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
Run Code Online (Sandbox Code Playgroud)

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