Вопрос дизайна - сервлеты, jsp, пользовательские теги, html

StackOverflow https://stackoverflow.com/questions/1897056

  •  19-09-2019
  •  | 
  •  

Вопрос

Я новичок в сервлетах и 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top