Search code examples
javaservletsrequestforward

Java servlets. How to reach previous url after login


I have simple application and at home page I created form to make login

<form action="login" method="post">
        <input type="hidden" name="ReturnUrl" value='${requestScope["javax.servlet.forward.request_uri"]}' />
        <input type="text" name="login" />
        <input type="password" name="password" />
        <input type="checkbox" name="RememberMe" checked/>
        <input type="submit" value="Make login" />
 <form/>

Idea is quite simple. After I make login I want to redirect to home page (value for ReturnUrl from home page I tested "/" and "/home" - result is the same)

Login servlet consists overidden doPost

@WebServlet("/login")
public class Login extends HttpServlet
{
    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String name = request.getParameter("login");
        String password = request.getParameter("password");
        // get value of remember me checkbox
        String rm = request.getParameter("RememberMe");
        boolean rememberMe = !(rm == null || rm.isEmpty());
        // get return url
        String ReturnUrl = request.getParameter("ReturnUrl");

        // make login here
        /*.....*/

        RequestDispatcher dispatcher = request.getRequestDispatcher(ReturnUrl);
        dispatcher.forward(request, response);
     }

 }

I expect that this code will call my home servlet what will show corresponding jsp.

@WebServlet("/home")
public class Home extends HttpServlet
{
    private static final long serialVersionUID = 1L;
    private final String page = "/WEB-INF/jsp/homePage.jsp";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        RequestDispatcher dispatcher = request.getRequestDispatcher(page);
        dispatcher.forward(request, response);
    } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        RequestDispatcher dispatcher = request.getRequestDispatcher(page);
        dispatcher.forward(request, response);
    }

}

And home page is displayed but url is still contains "/login". I expect that it should be "/home" because I forwarded request from one servlet to other. Why url did not changed? Does forward change url?


Solution

  • You need user to redirect to returnURL not forward

    response.sendRedirect(returnURL);