Вопрос дизайна - Перенаправление URL - PullRequest
1 голос
/ 07 января 2010

Я начинающий программист сервлетов. Я пытаюсь сделать это правильно.

Я написал фильтр для перехвата запроса сервлета и проверки, требуется ли для входа в систему пользователь. Если это так, пользователь перенаправляется на страницу входа. Это работает. Но затем я хочу перенаправить пользователя обратно на страницу, на которую он хотел перейти. Как правильно сохранить это состояние? Хранить ли URL-адрес в структуре данных, проиндексированной с использованием идентификатора сеанса из файла cookie?

Ответы [ 3 ]

2 голосов
/ 07 января 2010

Вы можете сохранить его в сеансе или добавить в URL для входа в систему.

http://www.myexample.com/login.jsp?from=mypage.jsp

Убедитесь, что вы url кодируете его (заменив /, &, = и т. Д. Соответствующим escape-значением (% xx)), если у него есть путь и имя файла.

http://www.myexample.com/login.jsp?from=mydir%2Fmypage.jsp
1 голос
/ 07 января 2010

Я написал фильтр для перехвата запроса сервлета и проверки, требуется ли для входа пользователя URL.

Кажется, это звучит неправильно. Вы должны скорее сопоставить Filter с тем же url-pattern из Servlet, а еще лучше с servlet-name из Servlet. Таким образом, Filter вызывается только , когда вызывается Servlet.

Возвращаясь к вашей актуальной проблеме: когда пользователь не вошел в систему, у вас есть два варианта:

  1. Сохранить URL-адрес в сеансе:

    if (session.getAttribute("user") == null) {
        session.setAttribute("back", httpRequest.getRequestURI());
        httpRequest.sendRedirect("login");
    } else {
        chain.doFilter(request, response);
    }
    

    который вы используете при входе в систему:

    User user = userDAO.find(username, password);
    if (user != null) {
        session.setAttribute("user", user);
        String back = (String) session.getAttribute("back");
        if (back != null) {
            session.removeAttribute("back");
            response.sendRedirect(back);
        } else {
            response.sendRedirect("home"); // Home page?
        }
    } else {
        // Show error?
        request.setAttribute("message", "Unknown user, please retry");
        request.getRequestDispatcher("login").forward(request, response);
    }
    
  2. Передать URL как параметр запроса:

    if (session.getAttribute("user") == null) {
        httpRequest.sendRedirect("login?back=" + httpRequest.getRequestURI());
    } else {
        chain.doFilter(request, response);
    }
    

    , через который вы переходите к последующему запросу в качестве скрытого поля ввода:

    <input type="hidden" name="back" value="${param.back}">
    

    который вы используете при входе в систему:

    User user = userDAO.find(username, password);
    if (user != null) {
        session.setAttribute("user", user);
        String back = request.getParameter("back");
        if (back != null) {
            response.sendRedirect(back);
        } else {
            response.sendRedirect("home"); // Home page?
        }
    } else {
        // Show error?
        request.setAttribute("message", "Unknown user, please retry");
        request.getRequestDispatcher("login").forward(request, response);
    }
    

Кодировка URL, как некоторые предполагают, не требуется, поскольку getRequestURI() не будет декодироваться.

1 голос
/ 07 января 2010

Не переизобретай колесо. Servlet API поддерживает аутентификацию и безопасность пользователей / ролей. Tomcat (среди прочих) включает встроенную поддержку аутентификации с использованием различных источников: XML-файл, база данных, LDAP и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...