2010-01-07 4 views
1

Я программист сервлета новичка. Я пытаюсь сделать это правильно.Вопрос дизайна - Перенаправление URL-адресов

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

ответ

1

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

Это звучит не так. Вы должны сопоставить Filter с тем же url-patternServlet, или еще лучше, на servlet-nameServlet. Таким образом, 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() не будет декодироваться.

+0

Большое спасибо за ваш подробный ответ.Ваш ответ приносит 2 балла для меня, что я не обращался - Вы сказали - вам лучше сопоставить Фильтр на том же url-образце сервлета, или еще лучше, на сервлет-имени сервлета Является ли это стандартной практикой? Я пишу один фильтр для каждой функции. Например, один для ведения журнала, один для проверки подлинности. Я сопоставляю их со всеми jsps и сервлетами. Я напишу второй вопрос в другом комментарии. – user220201

+0

Вы сказали буквально, что вы проверяли URL-адрес в фильтре, чтобы узнать, требуется ли пользователю войти в систему. Это необязательно, если вы сопоставляете фильтр с шаблоном 'url-pattern', который точно соответствует этому URL-адресу. Или если уже есть какой-то сервлет контроллера на том же «url-образце», а затем сопоставьте его на этом сервлете. В любом случае фильтр не будет вызван без необходимости. – BalusC

+0

Другой вопрос об аутентификации с использованием базы данных. На данный момент я написал свой собственный класс подключения к базе данных и сам пишу сам код или манипуляцию с БД. Я знаю, что могу использовать Hibernate. Но есть ли что-то специфическое для аутентификации? Что такое userDAO. Также Асаф говорил о встроенной поддержке безопасности tomcat. Каким будет предпочтительный способ для крупномасштабных приложений (ориентированных на потребителя, а не предприятий)? - Спасибо. – user220201

2

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

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

Убедитесь, что вы url encode его (замена /, &, = и т.д. с соответствующим значением убегания (% хх)), если у него есть путь, а также имя файла.

http://www.myexample.com/login.jsp?from=mydir%2Fmypage.jsp 
+0

Спасибо! Я знал, что будет лучший способ сделать это. Я программист на C и поэтому стараюсь создать структуру данных для всего: – user220201

1

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

+0

Сколько еще колес аутентификации нужно миру? – Timothy

Смежные вопросы