La sessione, con tutti gli eventuali dati chiave->valore contenuti, sta sempre e solo sul server. Quello che client e server al massimo si scambiano è solo il ID della sessione. Questo può essere fatto in due modi: tramite cookie o tramite l'url. I cookie però sono disabilitabili su tutti i vari browser, quindi l'alternativa sicura è solo quella del url.
Se consideriamo solo lo sfruttamento dei cookie, non hai nulla di particolare da fare. Nella Servlet A farai:
HttpSession session = request.getSession();
ed otterrai un (nuovo, eventualmente) HttpSession. Se nella pagina A che l'utente visualizza a seguito della richiesta alla Servlet A, c'è un link che porta ad una pagina B, allora nella request ad una Servlet B, idem farai:
HttpSession session = request.getSession();
ed otterrai lo stesso HttpSession ottenuto dalla precedente richiesta. Nota che (e lo dice bene la documentazione), getSession() deve essere invocato prima che la response sia "committed", altrimenti ottieni IllegalStateException.
E se i cookie fossero disabilitati? Se vuoi che il tuo sito funzioni anche in questo caso, allora devi prendere degli accorgimenti, ovvero devi fare il encoding di tutti gli url che vengono emessi in output sulle pagine.
Se scrivi sulla response dalla Servlet, dovrai fare es.:
codice:PrintWriter out = response.getWriter(); out.print("<a href=\""); out.print(response.encodeURL("blabla/paginaB")); out.print("\">pagina B</a>");
Nelle JSP si può usare più comodamente il tag <c:url> di JSTL:
codice:<a href="<c:url value="blabla/paginaB"/>">pagina B</a>
Questo encoding accoda dietro il url il ID di sessione in una forma particolare che il servlet container/application server è poi in grado di riconoscere ad una successiva request con quel link.