#session #cookies #websphere #single-sign-on
#сеанс #файлы cookie #websphere #единый вход
Вопрос:
У меня следующая настройка: запрос поступает через балансировщик нагрузки на сервер Websphere IHS, который пересылает запрос на сервер приложений, также Websphere. Проблема, с которой я сталкиваюсь при включении единого входа, заключается в том, что при каждом запросе создается новый сеанс.
Я знаю это, потому что я написал сервлет отслеживания, и идентификатор сеанса отличается для каждого запроса. Веб-сервер и сервер приложений настроены для работы с файлами cookie, а в балансировщике нагрузки включены сеансы с привязкой.
Я использую spenego, поскольку это websphere и kerberos config для проверки пользователя из Active Directory.
У кого-нибудь есть какие-либо идеи / указания относительно того, почему мой сеанс создается при каждом запросе только тогда, когда включен единый вход. Без единого входа сеанс одинаков для разных запросов. Я перепробовал много разных настроек в websphere, но ни одна из них не работала. например, кластеризация на уровне сервера, включение флажка безопасности в websphere session management и т. Д..
Я также попытался создать свой собственный файл cookie и поместить его обратно в ответ, думая, что он вернется в запросе, но, как и раньше, файл cookie не отправляется обратно. Файл cookie JSessionID также не отображается. Также при создании моего собственного файла cookie, как вы можете видеть в журналах, в нем указано, что com.ibm.ws.webcontainer.srt.SRTServletResponse addCookie ПРЕДУПРЕЖДЕНИЕ: не удается установить заголовок. Ответ уже зафиксирован.
Если вам нужна дополнительная информация, пожалуйста, спросите, и я буду рад предоставить
тогда исправьте детали:
В моем сервлете есть следующий код для проверки информации о сеансе и создания собственного файла cookie
//lets try setting a cookie into the response
System.out.println("Setting a new cookie into the session");
String user = "";
if(req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal") != null) {
user = req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal").toString();
Cookie userCookie = new Cookie("userId", user);
userCookie.setMaxAge(60*60*24*365); //Store cookie for 1 year
res.addCookie(userCookie);
}
HttpSession session = req.getSession(false);
if ( session != null )
{
out.println("<h2>Session information:</h2>");
out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
print(out, "Session ID", session.getId());
print(out, "Last accessed time", new Date(session.getLastAccessedTime()).toString());
print(out, "Creation time", new Date(session.getCreationTime()).toString());
String mechanism = "unknown";
if ( req.isRequestedSessionIdFromCookie() )
{
mechanism = "cookie";
}
else if ( req.isRequestedSessionIdFromURL() )
{
mechanism = "url-encoding";
}
print(out, "Session-tracking mechanism", mechanism);
out.println("</table><BR><BR>");
Enumeration vals = session.getAttributeNames();
if (vals.hasMoreElements())
{
out.println("<h2>Session values</h2>");
out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
while (vals.hasMoreElements())
{
String name = (String)vals.nextElement();
out.println("<tr><td>" escapeChar(name) "</td><td>" escapeChar(session.getAttribute(name).toString()) "</td></tr>");
}
out.println("</table><BR><BR>");
}
}
out.println("</body></html>");
}
И следующий код для проверки файлов cookie в запросе
Cookie[] cookies = req.getCookies();
if ( cookies != null amp;amp; cookies.length > 0 )
{
out.println("<H2>Client cookies</H2>");
out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
for ( int i=0; i<cookies.length; i )
{
out.println("<tr><td>" escapeChar(cookies[i].getName()) "</td><td>" escapeChar(cookies[i].getValue()) "</td></tr>");
}
out.println("</table><BR><BR>");
}
and the following checks the request attributes
e = req.getAttributeNames();
if ( e.hasMoreElements() )
{
out.println("<h2>Request attributes:</h2>");
out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
while ( e.hasMoreElements() )
{
String name = (String)e.nextElement();
System.out.println("Reuqest Attribute Faisal**************" name "********" req.getAttribute(name).toString());
if(req.getSession() != null) {
System.out.println("**************Session id = " req.getSession().getId());
} else {
System.out.println("**************Session is null");
}
if(req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal") != null) {
if(req.getSession(false) != null) {
System.out.println("****Got the old Session id Faisal = " req.getSession().getId());
req.getSession().setAttribute("user.principal", req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal"));
}
}
out.println("<tr><td>" escapeChar(name) "</td><td>" escapeChar(req.getAttribute(name).toString()) "</td></tr>");
}
out.println("</table><BR><BR>");
}
Итак, при первой отправке запроса все мои переменные сеанса и атрибуты запроса распечатываются, при второй отправке запроса пользователь-участник недоступен, и мои журналы выглядят следующим образом
[6/18/14 9:33:17:445 BST] 0000002f SystemOut O Reuqest Attribute**************javax.servl
et.request.key_size********128
[6/18/14 9:33:17:445 BST] 0000002f WASSessionCor W SessionAffinityManager setCookie SESN0066E: The r
esponse is already committed to the client. The session cookie cannot be set.
[6/18/14 9:33:17:447 BST] 0000002f srt W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dSessionCookie WARNING: Cannot set session cookie. Response already committed.
[6/18/14 9:33:17:448 BST] 0000002f SystemOut O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:448 BST] 0000002f SystemOut O ****Got the old Session id = N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:448 BST] 0000002f SystemOut O Reuqest Attribute**************javax.servl
et.request.cipher_suite********RC4-SHA
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O ****Got the old Session id= N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O Reuqest Attribute**************com.ibm.ws.
security.spnego.UserPrincipal********user@domain.COM
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O ****Got the old Session id = N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O Reuqest Attribute**************com.ibm.web
sphere.servlet.uri_non_decoded********/lbgssoclient/snoop/
[6/18/14 9:33:17:449 BST] 0000002f SystemOut O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:450 BST] 0000002f SystemOut O ****Got the old Session id= N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:452 BST] 0000002f SystemOut O Setting a new cookie into the session
[6/18/14 9:33:17:452 BST] 0000002f srt W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dCookie WARNING: Cannot set header. Response already committed.
[6/18/14 9:35:01:745 BST] 0000002e SystemOut O Reuqest Attribute**************javax.servl
et.request.key_size********128
[6/18/14 9:35:01:746 BST] 0000002e WASSessionCor W SessionAffinityManager setCookie SESN0066E: The r
esponse is already committed to the client. The session cookie cannot be set.
[6/18/14 9:35:01:747 BST] 0000002e srt W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dSessionCookie WARNING: Cannot set session cookie. Response already committed.
[6/18/14 9:35:01:749 BST] 0000002e SystemOut O **************Session id = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:750 BST] 0000002e SystemOut O Reuqest Attribute**************javax.servl
et.request.cipher_suite********RC4-SHA
[6/18/14 9:35:01:750 BST] 0000002e SystemOut O **************Session id = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:750 BST] 0000002e SystemOut O Reuqest Attribute**************com.ibm.web
sphere.servlet.uri_non_decoded********/lbgssoclient/snoop/
[6/18/14 9:35:01:750 BST] 0000002e SystemOut O **************Session id Faisal = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:752 BST] 0000002e SystemOut O Setting a new cookie into the session
Приветствуются любые советы или указания. я знаю, что здесь много информации, но я действительно борюсь с этим.
Спасибо
Обновить:
После добавления session listner для мониторинга сеанса я заметил в журналах следующее
[6/18/14 12:45:40:880 BST] 00000025 ServerCache I DYNA1071I: The cache provider "default" is being used.
[6/18/14 12:45:40:937 BST] 00000025 SystemOut O getting session for attributes print out
[6/18/14 12:45:40:938 BST] 00000025 SystemOut O Reuqest Attribute **************javax.servlet.request.key_size********128
[6/18/14 12:45:40:941 BST] 00000025 SystemOut O sessioncreated
[6/18/14 12:45:40:941 BST] 00000025 SystemOut O 1403091940939
[6/18/14 12:45:40:942 BST] 00000025 SystemOut O oN74OFyuPHcnyoxO_YBLK7z
[6/18/14 12:45:40:942 BST] 00000025 SystemOut O 1403091940939
[6/18/14 12:45:40:943 BST] 00000025 SystemOut O 1800
[6/18/14 12:45:40:943 BST] 00000025 SystemOut O sessionCreated - add one session into counter
[6/18/14 12:45:40:944 BST] 00000025 WASSessionCor W SessionAffinityManager setCookie SESN0066E: The response is already committed to the client. The session cookie cannot be set.
[6/18/14 12:45:40:945 BST] 00000025 srt W com.ibm.ws.webcontainer.srt.SRTServletResponse addSessionCookie WARNING: Cannot set session cookie
. Response already committed.
в последних нескольких строках указано, что невозможно установить файл cookie сеанса, поскольку ответ уже зафиксирован. Кто-нибудь знает, как это решить?
Комментарии:
1. Я никогда не видел такого поведения. Возможно, ваш браузер или что-то в этом роде удаляет файлы cookie. После успешной аутентификации у вас должен быть файл cookie JSESSIONID и файл cookie LtpaToken2, независимо от того, используете ли вы SPNEGO или нет. Возможно, ваше доменное имя в конфигурации единого входа неверно.
2. Я посмотрю на доменное имя. Спасибо. Пожалуйста, ознакомьтесь с моим обновлением после добавления прослушивателя сеанса.
3. Что касается файлов cookie, сначала вам нужно добавить / изменить файлы cookie в ответе, затем получить writer и распечатать его, в противном случае у вас будет сообщение об уже зафиксированном ответе.
4. Мне удалось решить проблему с сеансом для каждого запроса, переместив вызов req.getsession() в первую строку кода. Однако я не совсем понимаю, как это было проблемой