У нас проблема с приложением, работающим под Websphere 6.1.0.31 с включенным параметром HTTPOnlyCookies.Проблема связана с апплетом, который устанавливает соединение через HttpURLConnection с сервлетом.Апплету передается идентификатор JSESSION со страницы JSP по параметрам.В вызове HttpURLConnect мы устанавливаем заголовок Cookie и включаем идентификатор JSESSION.Сервлет не использует переданный файл cookie, создает новый сеанс и вызывает ошибку.При отключенном HTTPOnlyCookies это работает без ошибок.Значение параметра (com.ibm.ws.webcontainer.HTTPOnlyCookies = *).
Ниже приведен измененный код, чтобы показать, как мы выполняем эту задачу.Я только изменил код, чтобы удалить любую информацию, связанную с проектом, так как это происходит в производственном программном обеспечении.
// The Applet
public class TheApplet extends JApplet {
private String servletURL;
private String sessionId;
public void init() {
this.sessionId = getParameter(SESSION_ID_PARAM);
this.servletURL = "https://THEURL/CONTEXT/TheServlet.do?params=params";
}
public void start () {
Thread t = new Thread(new Runnable() {
public void run() {
HttpClient httpClient = new HttpClient(this.servletURL, this.sessionId);
Map theMap = httpClient.getData();
}
});
t.start();
}
}
public class HttpClient {
public Map getData() {
ObjectInputStream ois = doGet(this.servletURL, this.sessionId);
/*
... Process return .. error happens before processing
*/
}
private ObjectInputStream doGet(String servletURL, String sessionId) {
URL url = new URL(servletURL);
HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
httpConn.setDoInput (true);
httpConn.setDoOutput (true);
httpConn.setRequestProperty("Cookie", "JSESSIONID="+sessionId);
httpConn.setUseCaches (true);
return new ObjectInputStream (httpConn.getInputStream ());
}
}
// The Servlet
// Struts 1.2.9
import org.apache.struts.actions.DispatchAction;
public class TheServletAction extends DispatchAction {
public ActionForward performGetData(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
Map theMap = new HashMap();
/*
... db call and build Map
*/
TheResponseWriter.writeObjectIntoResponse(theMap, response);
}
}
public class TheResponseWriter {
public static void writeObjectIntoResponse(Object oObjToWrite, HttpServletResponse response) {
ServletOutputStream out = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
response.setContentType("application/octet-stream");
oos.writeObject(oObjToWrite);
oos.flush();
oss.close();
out.close();
}
}
Ниже приведена ошибка, которую я вижу в файле трассировки консоли Java или из апплета.Опять же, изменяя только небольшую информацию, я также заметил в WASReqURL, что у него нет «имени хоста»
network: Cache entry not found [url: https://THEURL/CONTEXT/TheServlet.do?params=params, version: null]
network: Connecting https://THEURL/CONTEXT/TheServlet.do?params=params with proxy=DIRECT
network: Connecting socket://THEURL:443 with proxy=DIRECT
network: Server https://THEURL/CONTEXT/TheServlet.do?params=params requesting to set-cookie with "WASReqURL=https:///CONTEXT/TheServlet.do?params=params; HTTPOnly; Path=/"
network: Cache entry not found [url: https://THEURL/CONTEXT/index.jsp, version: null]
network: Connecting https://THEURL/CONTEXT/index.jsp with proxy=DIRECT
network: Connecting socket://THEURL:443 with proxy=DIRECT
network: Server https://THEURL/CONTEXT/index.jsp requesting to set-cookie with "JSESSIONID=; HTTPOnly; Expires=Thu, 01 Dec 1994 16:00:00 GMT; Domain=THEURL"
network: Server https://THEURL/CONTEXT/index.jsp requesting to set-cookie with "JSESSIONID=dfdsfdsafds3q32-sad9287287:163bb19cr; HTTPOnly; Path=/"
- Wed Dec 14 09:05:58 EST 2011 - ERROR - Thread-8 - com.the.package.HttpClient - java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A
Спасибо за любую помощь, и, пожалуйста, дайте мне знать о любой дополнительной информации, которая может вам понадобиться,Я не могу найти ничего, что могло бы помочь.
_ Добавление дополнительной информации
В производственной строке (httpConn.setRequestProperty ("Cookie", "JSESSIONID ="+ sessionId);) даже нет, и процесс работает нормально.Но наш клиент хочет включить настройку httpOnly на своей веб-сфере, но не работает.Возможно, я нашел причину, по которой прохождение сессии не работает.Просматривая заголовки cookie, я заметил, что JSESSIONID в заголовке отличается от того, который установлен в качестве параметра для апплета.Посмотрев на это, я нашел информацию о формате JSESSIONID для кластерных сред.https://www.ibm.com/developerworks/mydeveloperworks/blogs/Dougclectica/entry/websphere_session_ids22?lang=en, который является CacheID + SessionID +: + CloneID.Я пытаюсь выяснить, как я могу получить эти значения на странице JSP.