Вопрос дизайна - сервлеты, jsp, пользовательские теги, html
Вопрос
Я новичок в сервлетах и jsp.Я хотел знать, каким был бы наилучший дизайн для примера задачи, для которой я пытаюсь написать код.Вот и все -
Я хочу создать веб-сайт (www.example.com), что просто перечисляет историю входа в систему каждого пользователя (не любой functionility либо кто-то хочет, но только примера ради).
Итак, здесь есть два URL-адреса - /index.jsp и /login (давайте предположим, что все регистрации выполнены).
Index.jsp покажет все прошлые логины для этого пользователя.Но для этого я должен определить, вошел ли пользователь уже в систему или нет.Если пользователь уже вошел в систему, я показываю ему его историю, в противном случае мне придется автоматически перенаправить его на страницу входа в систему.
Я уже написал пользовательский криптографически надежный файл cookie, который сообщит мне, вошел пользователь в систему или нет.Таким образом, если файл cookie отправлен мне, я могу проверить, аутентифицирован ли он, истек ли срок действия файла cookie / сеанса или нет.Это не проблема.
Проблема дизайна, с которой я столкнулся, заключается в следующем - как следует вызывать класс java, проверяющий аутентификацию?Использую ли я пользовательские теги jsp для проверки этого и перезаписи страницы?Я хочу упростить использование класса моими разработчиками html при создании новых страниц.Каков наилучший способ сделать это?
Я предполагаю, что мой вопрос больше связан с правильным использованием java-кода в jsp и / или может быть с пользовательскими библиотеками тегов.Пожалуйста, не стесняйтесь разглагольствовать так долго, как вам захочется :)
Спасибо, что прочитали.
- Вас
Решение
Вы можете использовать Filter
для этого.Таким образом, вы можете сохранить логику кода в одном месте без необходимости копировать один и тот же код на все страницы JSP, и это также хорошо сохраняет JSP скрипт-бесплатно.
Вместо того чтобы изобретать сеанс заново, создавая файл cookie самостоятельно, вы также можете просто воспользоваться предоставленным Java EE HttpSession
API.По сути, это уже поддерживается файлом cookie, и вы можете сохранять объекты Java в сеансе в качестве атрибутов, чтобы они оставались доступными в течение всего сеанса пользователя.
При входе в систему просто введите User
объект в HttpSession
:
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
} else {
// Show error.
}
Чтобы проверить, вошел ли пользователь в систему, используйте Filter
.Внедрить doFilter()
способ заключается в следующем:
if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
chain.doFilter(request, response); // User is logged in, just continue with request.
} else {
((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
}
и нанесите это на карту url-pattern
Нравится /secured
, /restricted
, /users
или около того.Поместите страницы JSP с ограниченным доступом в ту же папку и в webcontent.
Чтобы выйти из системы пользователя, просто удалите его из сеанса:
request.getSession().removeAttribute("user");
// Or, more drastically, invalidate the entire session:
request.getSession().invalidate();
Тем не менее, Java EE уже обеспечивает декларативную (на основе xml-конфигурации) безопасность, управляемую контейнерами, вы можете найти руководство по этому вопросу здесь.Вы можете использовать это, но если вы хотите, чтобы ваше приложение независимо перехватывало логины, управляемые контейнером, например, для просмотра истории входа в систему, то вам все равно нужно создать Filter
.Например:
HttpServletRequest httpRequest = (HttpServletRequest) request;
UserPrincipal user = httpRequest.getUserPrincipal();
HttpSession session = httpRequest.getSession();
if (user != null && session.getAttribute("user") == null) {
session.setAttribute("user", user);
// First-time login. You can do your intercepting thing here.
}
chain.doFilter(request, response);