Pass Hidden parameters using response.sendRedirect()

后端 未结 4 412
天涯浪人
天涯浪人 2020-11-28 06:22

How would I pass hidden parameters? I want to call a page (test.jsp) but also pass 2 hidden parameters like a post.

response.sendRedirect(\"/content/test.jsp         


        
相关标签:
4条回答
  • 2020-11-28 06:41

    TheNewIdiot's answer successfully explains the problem and the reason why you can't send attributes in request through a redirect. Possible solutions:

    1. Using forwarding. This will enable that request attributes could be passed to the view and you can use them in form of ServletRequest#getAttribute or by using Expression Language and JSTL. Short example (reusing TheNewIdiot's answer] code).

      Controller (your servlet)

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

      View (your JSP)

      Using scriptlets:

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

      This is just for information purposes. Scriptlets usage must be avoided: How to avoid Java code in JSP files?. Below there is the example using EL and JSTL.

      <c:out value="${message}" />
      
    2. If you can't use forwarding (because you don't like it or you don't feel it that way or because you must use a redirect) then an option would be saving a message as a session attribute, then redirect to your view, recover the session attribute in your view and remove it from session. Remember to always have your user session with only relevant data. Code example

      Controller

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

      View

      Again, showing this using scriptlets and then EL + JSTL:

      <%
          out.println(session.getAttribute("message"));
          session.removeAttribute("message");
      %>
      
      <c:out value="${sessionScope.message}" />
      <c:remove var="message" scope="session" />
      
    0 讨论(0)
  • 2020-11-28 06:43

    Using session, I successfully passed a parameter (name) from servlet #1 to servlet #2, using response.sendRedirect in servlet #1. Servlet #1 code:

    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");
    

    In Servlet #2, you don't need to get name back. It's already connected to the session. You could do String name = (String) request.getSession().getAttribute("name"); ---but you don't need this.

    If Servlet #2 calls a JSP, you can show name this way on the JSP webpage:

    <h1>Welcome ${name}</h1>

    0 讨论(0)
  • 2020-11-28 07:00

    To send a variable value through URL in response.sendRedirect(). I have used it for one variable, you can also use it for two variable by proper concatenation.

    String value="xyz";

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

    0 讨论(0)
  • 2020-11-28 07:03

    Generally, you cannot send a POST request using sendRedirect() method. You can use RequestDispatcher to forward() requests with parameters within the same web application, same context.

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

    The HTTP spec states that all redirects must be in the form of a GET (or HEAD). You can consider encrypting your query string parameters if security is an issue. Another way is you can POST to the target by having a hidden form with method POST and submitting it with javascript when the page is loaded.

    0 讨论(0)
提交回复
热议问题