2012-05-31 5 views
4
версии

Apache Tomcat: 6.0.20j_security_check не доступен, если пользователь уже зарегистрирован в

Если пользователь уже зарегистрирован, и он пытается снова войти с входом в странице, j_security_check не имеется ошибка встречается. Это нормальное поведение, или я должен что-то сделать?

На самом деле у меня разные роли пользователей для доступа к различным страницам, а когда доступ к странице лишен определенного пользователя, я хочу перенаправить его на страницу входа, где он может войти с соответствующими учетными данными.

ответ

5

Это обычное поведение: спецификация сервлета устанавливает только процедуру аутентификации, управляемой контейнером (т. Е. Логин), когда пользователь запрашивает защищенный ресурс, а пользователь еще не предоставил учетные данные. Все остальные сценарии остаются неопределенными, включая ваши.

Если вы хотите зафиксировать «запрещенные» условия, вы можете использовать сопоставления < ошибок в вашем WEB-INF/web.xml, чтобы отправить пользователя в любом месте, включая страницу входа. Просто помните, что контейнер будет принимать логин только после того, как вышеуказанные условия будут истинными, поэтому вам, возможно, придется сначала вывести пользователя из системы (завершая сеанс пользователя).

Что я могу порекомендовать - это «запрещенная» страница, в которой говорится: «У вас нет доступа к этому ресурсу. Если вы хотите войти в систему как другой пользователь для доступа к ней, нажмите [ЗДЕСЬ] где [ЗДЕСЬ] является ссылкой на сервлет, который завершает сеанс пользователя, а затем перенаправляется на ресурс, к которому пользователь пытался получить доступ. Это приведет к тому, что контейнер запросит аутентификацию (т. Е. Представит форму входа), проверьте учетные данные и отправьте пользователя на нужный ресурс.

Если вы используете контейнер (и webapp) вместе с версией 3.0 спецификации сервлета, существует новый метод HttpServletRequest.login(), который можно использовать для программного входа пользователя в ваш webapp. Вы могли бы использовать это вместо того, чтобы прекращать сеанс и выполнять все эти перенаправления ... вместо этого вы могли бы сами получить имя пользователя и пароль, а затем попросить контейнер сделать логин для вас.

+0

Как сказал Крис. – Pidster

+0

Есть ли способ указать ошибку, более конкретную, чем просто 404? Или 404 произойдет только в том случае, когда пользователь пытается войти в систему, когда он уже вошел в систему? –

+0

Возможно, вы можете сопоставить ресурс с '/ j_security_check' в своем собственном веб-приложении. Когда пользователь не проходит проверку подлинности, вероятно, он увидит этот ресурс. Вероятно, не стоит полагаться на такое поведение, поскольку спецификация сервлета явно не говорит, что происходит, когда '/ j_security_check' вызывается, когда пользователю не требуется аутентификация. –

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