Struts 2: пользователь 1 входит в систему и получает данные пользователя, который вошел в систему непосредственно перед этим с другого компьютера.

У меня проблема с приложением struts 2. Пользователь 1 успешно входит в систему и перенаправляется на какую-то страницу. После этого пользователь 2 пытается войти со своего компьютера, она перенаправляется на целевую страницу пользователя 1.

Я не уверен, является ли это проблемой с веб-контейнером (веб-логикой) или какой-то проблемой в моем кодировании. Я не могу понять, где я могу ошибиться и как сервер может предоставлять данные из сеанса другого пользователя.

Действие входа в систему реализовано с учетом сеанса, у меня есть сеттер и геттер для карты сеанса. Если действие входа в систему завершается успешно, пользователь перенаправляется к другому действию, где действие снова реализует сеансовые функции.

Проблема действительно странная. Может ли кто-нибудь предложить какие-либо причины, почему это может происходить.

Кроме того, чтобы добавить сложности, одно и то же приложение ear отлично работает локально. Проблема возникает только тогда, когда я пытаюсь развернуть его на тестовом сервере.

Вот код интерцептора. Я не думаю, что это небезопасно для потоков.

public class UserAuthentication extends AbstractInterceptor
{
    public UserAuthentication()
    {
    }

    public void init(){//System.out.println("init'd");
    }

    public void destroy() {System.out.println("destroyed");}

    public String intercept(ActionInvocation invocation) throws Exception
    {      
        String className = invocation.getAction().toString();
        Map OHRMS = ActionContext.getContext().getSession();

         System.out.println("EmpInfoUpd: " + new Date() + " Inside the interceptor: ");  
        System.out.println("EmpInfoUpd: " + new Date() + " Interceptor called for action: " + className); 
        System.out.println("EmpInfoUpd: " + new Date() + " Now printing the entries of session map from interceptor: " + OHRMS);


        Employee temp = (Employee)OHRMS.get("emp");
        if(temp==null)  
        { System.out.println("EmpInfoUpd: " + new Date() + " The session had no \"emp\" object. Interceptor returned \"login\" ");
            return "login";
        }
        System.out.println("EmpInfoUpd: " + new Date() + " The session had \"emp\" object with Employee name: " + temp.getFullName()+ " Interceptor returned \"login\" ");
            return invocation.invoke();

    }
}

person Rpant    schedule 16.01.2013    source источник
comment
На данный момент это невозможно сказать. Когда вы говорите, что это не происходит локально, вы имеете в виду никогда, в том числе под нагрузкой, или просто никогда, когда я пробую это с двумя людьми на одной машине?   -  person Dave Newton    schedule 17.01.2013
comment
никогда ... и дело не в том, что проблема возникает на тестовом сервере только тогда, когда он находится под нагрузкой ... проблема ВСЕГДА возникает на тестовом сервере, даже если два пользователя входят в систему. Второй пользователь, который входит в систему, увидит данные первого пользователя.   -  person Rpant    schedule 17.01.2013
comment
Стек перехватчика по умолчанию?   -  person Dave Newton    schedule 17.01.2013
comment
добавлен еще один перехватчик поверх перехватчика по умолчанию. Этот перехватчик проверяет, существует ли объект emp в сеансе, иначе перенаправляет на страницу входа.   -  person Rpant    schedule 17.01.2013
comment
добавил к вопросу тег weblogic, так как проблема выглядит специфичной для него. Тот же код отлично работает на локальном сервере.   -  person Rpant    schedule 17.01.2013
comment
Является ли перехватчик потокобезопасным?   -  person Dave Newton    schedule 17.01.2013
comment
как мне это сделать. не могли бы вы помочь. кроме того, я не думаю, что это имеет какое-либо отношение к проблеме ... потому что перехватчик просто действует как привратник.   -  person Rpant    schedule 17.01.2013
comment
Возможно, но поскольку я этого не вижу и не знаю, в чем проблема с предоставленной информацией, важно изолировать различия между вашим приложением и стандартной конфигурацией S2.   -  person Dave Newton    schedule 17.01.2013


Ответы (2)


Я почти уверен, что это связано с тем, что Interceptor не является потокобезопасным.

Некоторое время назад я отлаживал что-то подобное и поделился этим опытом в ответе на вопрос, аналогичный вашему, особенно о том, как реализовать перехватчик, безопасный для потоков:

Пользовательский сеанс перепутался с tomcat

надеюсь, это поможет

ИЗМЕНИТЬ

Попробуйте изменить это:

Map OHRMS = ActionContext.getContext().getSession();

к этому

Map OHRMS = invocation.getInvocationContext().getSession();

И посмотрите, действует ли он так же в тестовой среде.

Я получил доступ к сеансу таким образом в своих перехватчиках, и у меня никогда не было проблем.

person Andrea Ligios    schedule 17.01.2013
comment
Я добавил сюда код перехватчика. Вы видите что-то не так с этим? Более того, локально все работает отлично. И потокобезопасность должна проявляться, когда одновременно участвуют пользователи. Здесь один пользователь входит в систему, а через минуту другой пользователь пытается войти со своей машины. - person Rpant; 17.01.2013
comment
Я не очень разбираюсь в управлении сервером. Но одно отличие при размещении на тестовом сервере заключается в том, что HTTP-запросы туннелируются. и запросы, которые не туннелируются, являются https.(secure) . Нашел это в скрипаче. - person Rpant; 17.01.2013
comment
Спасибо за помощь.. но и это не помогло. - person Rpant; 17.01.2013

Спасибо всем за ваши усилия. Проблема заключалась в том, что я использовал расширение .html для всех страниц Strut, а тестовый веб-сервер думал, что это статические страницы. Так вернули последнюю обслуженную страницу. Проблема окончательно решена после смены расширения страниц на .action

person Rpant    schedule 17.01.2013