2014-09-10 2 views
1

Im разрабатывает простую веб-приложение с Apache Tomcat и Java EE.Остановить Tomcat, чтобы сохранить учетные данные пользователя

Я использую свое собственное доменное пространство JDBC для защиты и аутентификации пользователей, и я использую базовый метод проверки подлинности с помощью j_security_check.

Я реализовал выход из Сервлета, и все работает нормально. Но когда я выхожу из системы, и я пытаюсь снова войти в систему, приложение или браузер используют предыдущие учетные данные, и даже не просят меня вводить другие учетные данные. Он просто автоматически регистрируется с использованием последних используемых учетных данных. Только когда я перезагружаю сервер и закрываю браузер (Chrome), tomcat снова запрашивает учетные данные.

Моей целью является предотвращение этого автоматического процесса входа в систему. Я делаю что-то неправильно?

Update: Мой выход из Servlet делает следующее:

response.setHeader("Cache-Control", "no-cache, no-store"); 
response.setHeader("Pragma", "no-cache"); 

request.getSession().removeAttribute("logonSessData"); 
request.getSession().invalidate(); 
response.sendRedirect(request.getContextPath() + "/index.jsp"); 

Моя Войти web.xml выглядит точно так же, как это:

<security-constraint> 
    <display-name>userConstraint</display-name> 
    <web-resource-collection> 
     <web-resource-name>User pages</web-resource-name> 
     <description/> 
     <url-pattern>/users/*</url-pattern> 
     <url-pattern>/retos/misiones/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>user</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <description/> 
     <transport-guarantee>NONE</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>SPERO</realm-name> 
</login-config> 
<security-role> 
    <description>Usuario registrado de SPERO</description> 
    <role-name>user</role-name> 
</security-role> 
<resource-ref> 
    <description>Spero DataBase Connection Pool</description> 
    <res-ref-name>jdbc/spero</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 
+0

Что делает ваш сервлет серфинга? это недействительность сессии должным образом? –

+0

Да, я проверил, что когда я отправляю неверные данные учетных данных, контейнер запрещает доступ. Поэтому я уверен, что это не проблема проверки подлинности. – chntgomez

ответ

0

Если приложение Servlet версии 3.0, вы должны использовать request.logout() в ваш сервлет выхода. Он должен правильно аннулировать сеанс и удалить учетные данные пользователя, см. Javadoc request.logout. Если Tomcat не реализует его правильно, вы должны позвонить session.invalidate()

+0

Я также очищаю кеш, прежде чем аннулировать сеанс. Это не основная причина. – chntgomez

+1

@chntgomez Пожалуйста, добавьте свой метод выхода на вопрос. И одно уточнение - вы не можете использовать BASIC и j_security_check. j_security_check для формы. Если вы используете Basic, учетные данные сохраняются в браузере и автоматически отправляются повторно. Вам нужно переключиться на форму. – Gas

+0

@chntgomez Вы входите в систему через форму или всплывающее окно браузера? И добавьте web.xml к вопросу, особенно '' login-config> 'part. – Gas

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