title: JSP: RequestDispatcher.forward() not forwarding when servlet called via Ajax POST
body: <p>I have a login form (login.jsp) with two input fields, username and password. </p>
  
  <p>I am using POST via Ajax to access the login servlet.</p>
  
  <p>I want the user to login, and if the login is successful, be redirected to another page called 'search.jsp'. If unsuccessful, a 'login failed' message is returned as the Ajax responseText to be inserted into a paragraph in the 'login.jsp' page.</p>
  
  <p>I have everything working, my login servlet accesses the database via a separate bean, and an object of that bean is returned with its properties ready to use. So all is good to there. </p>
  
  <p>But, after the username and password pass muster with the database, I'm then using RequestDispatcher to forward to the new landing page (search.jsp). </p>
  
  <p>Here is my doPost()</p>
  
  <pre><code>protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String username,password;
      username = request.getParameter("p");
      password = request.getParameter("q");       
  
      try {
          LoginService ls = new LoginService(username,password);
          User user = ls.getUserDetails();            
  
          if(user.getUsername()!=null &amp;&amp; user.getPassword()!=null){
              FormService filler = new FormService();
              Form fields = filler.getFields();
  
              request.setAttribute("user",user); 
              request.setAttribute("fields1",fields);
              request.setAttribute("fields2",fields);
              request.setAttribute("fields3",fields);
  
  
              HttpSession session = request.getSession(true);
              //set attribute for the session
              session.setAttribute("user",user.getUsername());
  
  //Now, the RequestDispatcher.forward() is not forwarding to the new page!
  //The whole 'search.jsp' page is being stuffed back into the 'login.jsp' page
  
              RequestDispatcher rd = request.getRequestDispatcher("search.jsp");
              rd.forward(request,response);               
              return;
          }
          else{
              PrintWriter out = response.getWriter();
              out.println("login failed!");
              return;
          }
      } catch (Exception e) {         
          e.printStackTrace();
      }       
  }
  </code></pre>
  
  <p>But instead of forwarding the request and response to the new jsp page 'search.jsp', the whole search.jsp page is being stuffed back into the the original login.jsp page - in the html element which holds the Ajax responseText in when login fails.  </p>
  
  <p>The forward() method in the servlet works when the servlet is called from the form action attribute, but not when the servlet is called the javascript file containing the Ajax code. </p>