Тестирование, если пользователь вошел в систему через JSP / Spring-MVC - PullRequest
3 голосов
/ 04 июня 2010

Используя Spring 3 MVC и JSP, я просто хочу проверить, вошел ли пользователь в систему, я не заинтересован в использовании Spring Security в настоящее время

<jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" />
<c:choose>
    <c:when test="myUser.loggedIn">
        //dostuff
    </c:when>
    <c:otherwise>
        //dootherstuff
    </c:otherwise>
</c:choose>

Но проблема в том, что когда в сеансе еще нет myAppUser, jsp: useBean выдает исключение. Теперь я понимаю, что у меня есть JSP: useBean на самом деле создает экземпляр объекта, давая ему класс, но мне не нравится знать, что где-то в некотором фрагменте JSP у меня есть объекты, которые создаются и добавляются в мой сеанс, поэтому я либо хочу всегда устанавливайте начальное значение для этого пользователя и управляйте им программно, или я хотел бы получить способ получить тот бин, который позволяет ему быть нулевым или не существующим, если он не существует, просто вернуть ноль

в любом случае все будет в порядке

если мой вопрос указывает на фундаментальное недопонимание того, что я должен делать, предоставьте ссылку на документацию, которая подробно объяснит этот вариант использования

Ответы [ 2 ]

4 голосов
/ 04 июня 2010

Это не правильный подход, но на самом деле вы можете решить конкретную проблему с помощью JSTL <c:catch>.

<c:catch var="e">
    <jsp:useBean id="myAppUser" type="com.xxx.MyUser" beanName="myUser" scope="session" />
</c:catch>
<c:choose>
    <c:when test="${empty e && myUser.loggedIn}">Logged in</c:when>
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise>
</c:choose>

Правильный подход описан в ответе Мэтта б. Вам действительно нужно решить это на более высоком уровне. Имейте bean-объект типа UserManager, который имеет User как дочернее свойство для нескольких методов, таких как login(User), logout() и isLoggedIn(). Если пользователь вошел в систему, то User должен быть ненулевым. Когда пользователь выходит из системы, для User должно быть установлено значение null.


Обновление согласно комментариям: В качестве альтернативы вы также можете просто избавиться от всего объявления jsp:useBean и перехватить присутствие MVC-инфраструктуры, введенной ${myUser} в сеанс. 1021 *

<c:choose>
    <c:when test="${myUser.loggedIn}">Logged in</c:when>
    <c:otherwise>Bean doesn't exist or user is not logged in</c:otherwise>
</c:choose>

EL будет прозрачно "подавлять" потенциальные исключения nullpointerexceptions и просто возвращать false.

2 голосов
/ 04 июня 2010

Тестирование на что-то вроде: "Этот человек вошел в систему?" при рассмотрении объекта Session в виде View стираются границы между ролями модели, представления и контроллера.

Независимо от определения правильного синтаксиса JSTL для использования, чтобы jsp:useBean не выдавал исключение, я предлагаю перенести проверку на вход в систему на стороне контроллера и выполнить тест представления, если свойство isLoggedIn существует модель.

  1. Контроллер проверяет, содержит ли сеанс пользовательский объект, добавляет свойство isLoggedIn в модель со значением true или false.
  2. Логика в представлении ветвится на значение ${isLoggedIn}.

Другими словами, представление должно проверять только модель на наличие свойств / данных и не иметь прямого доступа к сеансу или другому состоянию.

...