Log out в JSP + Tomcat

Модератор: Absurd

Ответить
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

как в JSP в томкате сделать log out если авторизация BASIC:

Код: Выделить всё

<security-constraint>
	<web-resource-collection>
		<web-resource-name>Name</web-resource-name>
		<url-pattern>/*</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>user</role-name>
	</auth-constraint>
</security-constraint>
<login-config>
	<auth-method>BASIC</auth-method>
	<realm-name>Name</realm-name>
</login-config>
способ из примеров томката

Код: Выделить всё

  if (request.getParameter("logoff") != null) {
    session.invalidate();
    response.sendRedirect("index.jsp");
    return;
  }
не канает.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Deady, дело тут не в Томкате и не в JSP, а в браузере и протоколе HTTP.
Бразуер сохраняет пару логин и пароль, если мне мой склероз не изменяет, до тех пор, пока посетитель не перейдёт в директорию выше (т.е. для которой пара не валидна) или же вообще домен не покинет (браузер не закроет). Т.е. если у тебя index.jsp в запароленной директории находится, то очевидно что это не сработает. Единственный способ принудительно указать браузеру, что пара невалидна, это снова ему отправить заголовок 401. Подробнее можно прочитать в rfc2617.
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

не канает. отправил сначала 401 ошибку, нажал back в браузере и обновил - никаких запросов на ввод имени/пароля.
потом перенаправил на уровень выше, и по аналогичному сценарию - тоже самое.
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

вот если браузер закрыть, а потом запустить снова, тогда катит )
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Deady, как только ты отправил 401 ответ сервера, ты должен сразу же должен в браузере увидеть диалог для ввода логина и пароля. Не увидеть его можно только по двум причинам: 1) заголовок неправильно сформирован 2) ты принял переданную тебе пару как правильную.
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

это код начиная с самого начала:

Код: Выделить всё

<%@ page contentType="text/html; charset=windows-1251"%>

<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>

	
<%!
	private Connection conn;
%>

<%
  if (request.getParameter("logoff") != null) {
    session.invalidate();
    //response.sendRedirect("http://localhost");
    response.sendError(401, "Logout successful.");
    return;
  }
%>


щас остановился на таком варианте:

Код: Выделить всё

<%
  if (request.getParameter("logoff") != null) {
    session.invalidate();
%>
<HTML>
<BODY onload="window.close()">
</BODY>
</HTML>
<%
	//response.sendRedirect("http://localhost");
	//response.sendError(401, "Logout successful.");
    return;
  }
%>
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Deady, если я ничего не путаю, то 401 должен быть самым первым ответом.
У тебя же первым пойдёт ответ 200. Запусти телнет и убедись в этом самостоятельно.
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

Вставил в самое начало файла:

Код: Выделить всё

<%
  if (request.getParameter("logoff") != null) {
    session.invalidate();
    response.sendError(401, "Logout successful.");
    return;
  }
%>
то же самое
Ответить