Alla ricerca di un hack per impedire di riscrivere un'app senza usare le variabili di sessione
-
07-07-2019 - |
Domanda
La nostra azienda utilizza un'app che in origine era ColdFusion + Access successivamente convertita in ASP + MS Sql classica per il monitoraggio di attività / tempo chiamato sistema di richiesta. È suddiviso per reparto, quindi ce n'è uno per MIS, marketing, logistica, ecc. Il problema si presenta quando (principalmente i manager) ne usano più di uno alla volta, con 2 finestre del browser aperte. Il sistema di richiesta utilizza variabili di sessione, molte variabili di sessione, " session " viene fatto riferimento 2300 volte nell'applicazione. Quando 2 sono aperti contemporaneamente, come puoi immaginare, ciò causa ogni sorta di anomalie dalle variabili che si confondono.
Nel sistema è presente una richiesta MIS di 3 anni per " fix " questo ed è stato lavorato su da 3 sviluppatori, e ora è il mio turno di provare. Mi chiedevo se qualcun altro ha dovuto lavorare su un progetto come questo, e se ci fosse una sorta di hack per cercare di mitigare alcuni dei problemi. Stavo pensando di forse chiamare qualcosa in global.asa per caricare misc. variabili di sessione dalla stringa di query. Il problema è che succede tutto questo:
If (Session("Application") <> Request("App")) and Request("App") <> "" THEN
Session("Application") = Request("App")
End If
Osservando le funzioni nei file include, avrai una funzione con 4 parametri, che fa riferimento a 6 diverse variabili di sessione. Quindi hai avuto l'idea, questo sarà doloroso.
Qualcuno ha dovuto fare qualcosa del genere in passato? Qualche hack che hai trovato utile?
Soluzione
rifattorizza il codice lontano dall'interfaccia Sessione diretta ("qualunque"):
- crea un'API per l'accesso alla sessione e sostituisci con essa qualsiasi uso esistente di Session (può essere una 'classe / oggetto' di sessione o solo un file include)
- manipola i nomi passati per le variabili di sessione con qualcosa che li renderà unici per dominio in base alle tue esigenze (dipartimento o altro)
- prova attentamente
quindi riscrivi il tutto in un secondo momento in un moderno linguaggio web e / o trova un altro lavoro prima che ti chiedano di compiere un altro miracolo ;-)
Altri suggerimenti
Il mio manager (che è un uomo d'affari, non un ragazzo di codice), è infatuato di questo sistema. Non ha fretta di riscriverlo. Se lo riscrivessi, le uniche variabili di sessione utilizzate sarebbero legate all'accesso. Sfortunatamente mi preoccupo più del veloce che del giusto :(
Quante volte " Sessione " è referenziato non significa tanto quanto sembra pensarlo. Inoltre, a meno che non si verifichi un errore di codifica, avere due browser aperti dovrebbe iniziare due sessioni separate e non dovrebbe esserci alcuna "miscelazione". dei valori per quelle sessioni.
Sospetto che potrebbe avere a che fare con qualcos'altro come entrambe le sessioni che leggono dallo stesso cookie o alcuni problemi con le variabili dell'app. Senza vedere l'intera fonte, è difficile da dire. Potrebbe valere la pena scoprire se c'è qualcuno che ha più familiarità con il codice per aiutarti.
E sì, sarà doloroso scavare nel codice, ma almeno ne saprai di più la prossima volta che dovrai correggere qualcosa. ;)
Inoltre, riscrivere non è sempre l'opzione migliore. Non si sa mai che tipo di divertenti logiche aziendali / correzioni di bug si perdono nelle riscritture.
Sono d'accordo con AnonJr
Blockquote avere due browser aperti dovrebbe iniziare due sessioni separate Blockquote
forse l'uso di variabili globali statiche sta causando la tua perdita di dati
Nella tua classe di sessioni (se ne userai una), quando fai riferimento a ciascuna variabile, usa un prefisso o qualcosa di comune in modo da poter identificare tutte le tue variabili ... quindi puoi scorrere TUTTE le variabili di sessione e forse trovarne altre a cui viene fatto riferimento / creato ...
Private Const PREFIX As String = "MyPrefix_"
Public Shared Property MyVariable() As String
Get
Return HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable"))
End Get
Set(ByVal value As String)
HttpContext.Current.Session(String.Concat(PREFIX, "MyVariable")) = value
End Set
End Property
loop per trovare variabili di sessione che non sono nella tua classe
For Each Item As Object In HttpContext.Current.Session.Contents
If Not Item.ToString.StartsWith(PREFIX) Then
End If
Next