Ищете взлом, чтобы предотвратить переписывание приложения без использования переменных сеанса - PullRequest
3 голосов
/ 10 ноября 2008

Наша компания использует приложение, которое изначально было ColdFusion + Access, позднее преобразованное в классический ASP + MS Sql для отслеживания задач / времени, называемое системой запросов. Он разбит по департаментам, поэтому есть один для MIS, маркетинга, логистики и т. Д. Проблема возникает, когда (в основном менеджеры) используют более одного за раз, с двумя открытыми окнами браузера. Система запросов использует переменные сеанса, множество переменных сеанса, в сеансе упоминается 2300 раз в приложении. Когда 2 открыты одновременно, как вы можете себе представить, это вызывает всевозможные аномалии из-за перепутывания переменных.

В системе есть 3-летний запрос MIS, чтобы «исправить» это, и над ним работали 3 разработчика, и теперь моя очередь попробовать. Мне было интересно, приходилось ли кому-то еще работать над таким проектом, и был ли какой-то взлом, чтобы попытаться смягчить некоторые из проблем. Я думал о том, чтобы вызвать что-то в global.asa для загрузки misc. переменные сеанса из строки запроса. Проблема в том, что все это происходит:

If (Session("Application") <> Request("App")) and Request("App") <> "" THEN
  Session("Application") = Request("App")
End If

Рассматривая функции во включаемых файлах, вы получите функцию с 4 параметрами, которая делает ссылки на 6 различных переменных сеанса. Итак, вы поняли, это будет больно.

Кто-нибудь должен был делать что-то подобное в прошлом? Какие хаки вы нашли полезными?

Ответы [ 5 ]

2 голосов
/ 10 ноября 2008

рефакторинг кода от прямого интерфейса Session («что угодно»):

  1. создать API для доступа к сеансу и заменить им все существующее использование сеанса (это может быть сеанс «класс / объект» или просто включаемый файл)
  2. искажать переданные имена для переменных сеанса с помощью чего-то, что сделает их уникальными для каждого домена в соответствии с вашими потребностями (отдел или что-то еще)
  3. тест тщательно

затем переписать все это позже на современном веб-языке и / или найти другую работу, прежде чем они попросят вас выполнить еще одно чудо; -)

0 голосов
/ 03 июля 2009

В вашем классе сеансов (если вы будете использовать один), когда вы ссылаетесь на каждую переменную, используете префикс или что-то общее, чтобы вы могли идентифицировать все свои переменные ... тогда вы можете перебрать ВСЕ переменные сеанса и, возможно, найти другие на которые ссылаются / создают ...

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

цикл для поиска переменных сеанса, которых нет в вашем классе

For Each Item As Object In HttpContext.Current.Session.Contents
    If Not Item.ToString.StartsWith(PREFIX) Then

    End If
Next
0 голосов
/ 23 ноября 2008

Я согласен с AnonJr

Blockquote два открытых браузера должны начинать два отдельных сеанса Blockquote

возможно использование статических глобальных переменных приводит к потере ваших данных

0 голосов
/ 23 ноября 2008

Сколько раз ссылается на «Сеанс», это не значит так много, как кажется. Кроме того, если нет ошибки кодирования, то при наличии двух открытых браузеров должны начаться два отдельных сеанса, и не должно быть никакого «смешения» значений для этих сеансов.

Я подозреваю, что это может быть связано с чем-то другим, например с чтением обоих сеансов из одного и того же файла cookie, или с некоторыми проблемами с переменными приложения. Не видя всего источника, сложно сказать. Возможно, стоит выяснить, есть ли кто-то, кто более знаком с кодом, чтобы помочь вам.

И да, будет больно копаться в коде, но, по крайней мере, вы узнаете больше в следующий раз, когда вам придется что-то исправлять. ;)

Кроме того, переписывание не всегда лучший вариант. Вы никогда не знаете, какие забавные бизнес-логики / исправления ошибок теряются при переписывании.

0 голосов
/ 10 ноября 2008

Мой менеджер (который занимается бизнесом, а не программистом), увлечен этой системой. Он не спешит переписывать это. Если бы я переписал это, единственные используемые переменные сеанса были бы связаны с логином. К сожалению, меня больше беспокоит пост, чем право: (

...