Файлы cookie httponly включили апплет ошибки связи с сервлетом - PullRequest
1 голос
/ 16 декабря 2011

У нас проблема с приложением, работающим под 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.

...