J2EE - Session swap

2

Server delle applicazioni - JBoss AS 7.1.1
JDK6
J2EE 1.3

La mia applicazione web ha più di 10 anni e affronta questo problema di scambio di sessione nel mio portale. Si accorse lo scambio avviene principalmente quando molti utenti concorrenti che accedono al portale e il server Windows sottostante è occupato (più del 90% di utilizzo della CPU)

Per analizzare questo problema, ho registrato i dati dei clienti (ID cliente, indirizzo IP, ID jsession) in una tabella e li ho trovati quel cliente con ID jsession unico ha inizialmente i suoi dati e all'improvviso per lo stesso ID jsession e indirizzo IP che riceve dati cliente diversi.

customer1  123.123.12.123   jsessionid123    11:10:02
customer2  123.123.12.123   jsessionid123    11:10:04

l'indirizzo ip (123.123.12.123) con ID jsession (jsessionid123) ottiene in qualche modo dati customer2

Qualsiasi ordine effettuato da customer1 in ip - 123.123.12.123 viene creato per customer2, l'ho confermato da chiamando customer2 e hanno confermato di non aver effettuato l'ordine. cliente1 non si renderà conto di averlo piazzato ordine per cliente2: tutti i dati vengono modificati, ad esempio articoli del carrello, oggetto del cliente, prodotti ecc.

Ora ho bisogno di trovare una soluzione per questo, ma prima devo sapere quale parte del mio codice sta creando questo problema.

Devo usare un software per stress test? o qualche altro meccanismo migliore per scoprire il codice problematico?

    
posta SyAu 14.01.2014 - 06:00
fonte

3 risposte

0

Ho trovato una soluzione per questo problema. Nel mio caso, la struttura interna ha ottenuto il codice seguente che ha causato il problema,

        ...
        req.setAttribute(key, value); /* This code gets executed for both REQUEST & SESSION */
        if (scope == Sp.SESSION) {
            req.getSession().setAttribute(key, value);
            ...

Ho notato che in qualche modo il codice mappa gli oggetti di sessione su jsessionid non corretto, quindi ho provato il codice seguente,

        ...
        if (scope == Sp.REQUEST) { /* Added this check */
            req.setAttribute(key, value);
        }
        if (scope == Sp.SESSION) {
            req.getSession().setAttribute(key, value);
            ...

È passato quasi un anno da questa correzione e lo swap non si è verificato affatto. Quindi sono sicuro che questa correzione del codice abbia risolto il problema dello swap.

    
risposta data 13.01.2016 - 00:55
fonte
1

Controlla se stai memorizzando i dati in singoletti (es. servlet) o in oggetti raggruppati. Per essere chiari, le variabili all'interno della funzione sono ok, solo qualcosa nel servlet stesso è un problema. Nel commento dici di scegliere l'azione, se scegli l'istanza esistente, non dovresti memorizzare i dati della sessione in esso.

Una volta ho visto (ehm, causato) un problema simile causato dall'errato utilizzo di listener di fase (in JSF) dove abbiamo creato listener per ogni richiesta (che ha portato a sindroms simili + mentre era estremamente lento (eseguendo gli ascoltatori molte volte) . Suppongo che questo non sia un tuo problema.

    
risposta data 14.01.2014 - 13:35
fonte
0

Ho già sperimentato qualcosa di simile prima. Nella mia esperienza, la classe Action che dovrebbe ricevere dati dal JSP viene istanziata come un singleton, quindi quando ci sono molti utenti concorrenti, la classe singleton viene "riutilizzata" che ha causato l'apparente "scambio di sessione".
Quindi controlla la classe che riceve gli input dell'utente (ad esempio, la classe Action nel framework struts) e assicurati che non sia un singleton.

    
risposta data 14.01.2014 - 08:52
fonte

Leggi altre domande sui tag