Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк. / 25 сообщений из 34, страница 1 из 2
12.12.2012, 10:38:28
    #38075264
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
Здравствуйте.

сделал по работе небольшое веб-проект по тестированию сотрудников.
используется JSP + Spring web MVC(2.5.6) + ojdbc6. крутится всё на Tomcat 6(и на 7 пробовал).

Краткое описание:
юзеры логинятся. кликают на выбранном тесте и начинают его проходить.

ПРОБЛЕМА: иногда(системы не выявил) при ответе на текущий вопрос(отсылается форма с вариантами ответов) - взору юзера открывается страница с Логином и текущим вопросом ДРУГОГО пользователя(из тех кто щас проходит тестирование).

тоесть отвечает Петя на свои вопросы, вдруг БАХ - система в браузер выводит ему что он Вася. если обновить или ответить на вопрос - то юзер опять станет Петей и продолжит отвечать свои вопросы.

Примерно понимаю в чем проблема(как я думаю). когда в сервлет на обработку поступают несколько почти-паралельно запросов, пока не сформировался ответ для Пети, ИД юзера обновляется на Васин. и далее из БД вытаскивается все как будто для Васи.
скорее всего глюк гдето у меня в коде. например какойто объект виден для всех запросов сразу. а не внутри текущей сессии.
были статические поля - убрал их.

каждый запрос обрабатывается классически в методе:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)

внутри него я определяю для каждого контроллера что показать, кто текущий юзер(по сессии), вытаскиваю данные из БД, сохраняю их в ModelAndView и потом в JSP вывожу вручную.

понимаю что без кода помочь мне сложно. но может подтолкнете в нужном направлении. где я мог допустить такой глюк. или может неправильно понимаю принцип работы сервлетов или самого Spring. переделываю и так и сяк - проблема остается.

помогите. явно детский глюк.
...
Рейтинг: 0 / 0
12.12.2012, 11:21:50
    #38075367
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
Поля где-то используете, где не следовало. Не только статические но и обычные. Контроллер и Transaction Script должны быть stateless.
...
Рейтинг: 0 / 0
12.12.2012, 11:53:13
    #38075452
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
Blazkowicz,

внутри каждого
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
я создаю НОВЫЙ объект (его я передаю потом во все необходимые методы, параметром, чтобы где нужно были доступны request, response, session)
Env env = new Env(request, response, true);
в его конструкторе получаю сессию
this.session = this.request.getSession(true);

из сесии вытаскиваю сохраненный ИД залогиненного юзера
env.UID = 0;
if (env.getSess().getAttribute("_UID_") != null) {
env.UID = Integer.valueOf(env.getSess().getAttribute("_UID_").toString());
}

и далее на основании этого env.UID уже делаю запросы в БД.
получается что как раз это поле env.UID и шарится между запросами от разных юзеров?

а как мне сделать это поле чтоб при обработке каждого запроса оно было уникальным а не общим для всех. я то считал как раз что раз я создал объект Env, то его поля будут доступны только для запроса. и по окончании него этот объект помрет.
...
Рейтинг: 0 / 0
12.12.2012, 11:55:56
    #38075456
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
авторизация на сайте через что? если пользователя храните в спринг-бине, то у него по умолчанию апп-scope. ну и scope прочих бинов проверьте
...
Рейтинг: 0 / 0
12.12.2012, 12:03:23
    #38075473
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
pavel_nvавторизация на сайте через что? если пользователя храните в спринг-бине, то у него по умолчанию апп-scope. ну и scope прочих бинов проверьте

авторизацию делаю сам ручками.
рисую сам форму в jsp, обрабатываю её в соответсвующем контроллере LoginController.
если авторизация прошла успешно, то сохраняю в сессию ИД залогиненного юзера. и редирект на главную страницу (IndexController).

а уже в IndexController опять по новое. если в сесии есть ИД юзера, то вытаскиваю его и полез в БД.(как описал выше)

данные юзера тащу из БД и кладу в объект Member. его тоже каждый раз заново создаю. бины самого спринга не использую.
...
Рейтинг: 0 / 0
12.12.2012, 12:05:34
    #38075480
ferc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r u, может LoginController - сингтон?
...
Рейтинг: 0 / 0
12.12.2012, 12:07:08
    #38075484
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
Логи нужно детальные писать. Тогда не придется гадать на форуме.
Код: java
1.
2.
3.
4.
env.UID = 0;
if (env.getSess().getAttribute("_UID_") != null) {
  env.UID = Integer.valueOf(env.getSess().getAttribute("_UID_").toString());
}


Для всех юзеров, у которых случайно не оказалось _UID_ в сессии, env.UID равен 0?
...
Рейтинг: 0 / 0
12.12.2012, 12:11:03
    #38075497
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
fercr u, может LoginController - сингтон?
public class LoginController extends AController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...........


AController это мой базовый контроллер для всех. каждый контролелер реализует интерфейс org.springframework.web.servlet.mvc.Controller.
т.е. явно синглтоном я никого не делал. может это делает сам Спринг. я его плохо знаю еще. потому возможно и наворотил чтото не так.
...
Рейтинг: 0 / 0
12.12.2012, 12:11:51
    #38075499
ferc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r u, вроде все бины в спринге по умолчанию синглтоны
...
Рейтинг: 0 / 0
12.12.2012, 12:11:55
    #38075501
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
BlazkowiczДля всех юзеров, у которых случайно не оказалось _UID_ в сессии, env.UID равен 0?
ну да. раз неавторизован - значит гость. а гость видит только форму логина.
...
Рейтинг: 0 / 0
12.12.2012, 12:15:31
    #38075513
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
fercr u, вроде все бины в спринге по умолчанию синглтоны
как сделать их НЕсинглтонами ? через указание scope Только?
получается что любой объект сохданный мной в методе
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
будет синглтоном?

опупеть. получается можно доверять только встроенным объектам request и response ?
...
Рейтинг: 0 / 0
12.12.2012, 12:26:00
    #38075544
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
нет, сам контроллер только будет синглтоном, что бы не создаваться каждый раз на каждый запрос.
В методах идет обычный жизненный цикл. Да и синглтонг/не синглтон задается только в контейнере, вы же в методах с контейнером не работаете (на первый взгляд)
...
Рейтинг: 0 / 0
12.12.2012, 12:28:15
    #38075546
ferc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r u, непонятно что у вас создается за объект. может через ThreadLocal надо?
...
Рейтинг: 0 / 0
12.12.2012, 12:31:18
    #38075558
ferc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
ferc, например, мне как-то нужно было чтобы для каждого юзера был свой класс со статичными полями, разрулилось через ThreadLocal
...
Рейтинг: 0 / 0
12.12.2012, 12:34:39
    #38075566
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
fercferc, например, мне как-то нужно было чтобы для каждого юзера был свой класс со статичными полями, разрулилось через ThreadLocal
В spring mvc нормально поддерживаеться scope для бинов - request/session/singleton и другие. Самодельные велосипеды, как раз и приводят к тому, что кто-то где-то забыл ThreadLocal почистить и второй клиент получает данные первого
...
Рейтинг: 0 / 0
12.12.2012, 12:35:36
    #38075568
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
fercr u, непонятно что у вас создается за объект. может через ThreadLocal надо?
просто объект. я его использую как контейнер для всякой информации.
в том числе и информации о том какой юзер сделал текущий запрос.

Env env = new Env(request, response);

public class Env {
...
public int UID = 0;
...
}


ладно. щас попробую изменить scope у всех контроллеров на prototype.
чтоб создавались заново всегда. если проблема исчезнет, значит по крайней мере я на правильном пути. и буду копать дальше.

спасибо всем.
...
Рейтинг: 0 / 0
12.12.2012, 12:36:01
    #38075572
ferc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
Blazkowicz, это было в vaadin
...
Рейтинг: 0 / 0
12.12.2012, 12:39:26
    #38075579
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
fercBlazkowicz, это было в vaadin
Это очень важно в контексте вопроса про Spring MVC.
...
Рейтинг: 0 / 0
12.12.2012, 12:41:52
    #38075587
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r uладно. щас попробую изменить scope у всех контроллеров на prototype.
чтоб создавались заново всегда. если проблема исчезнет, значит по крайней мере я на правильном пути. и буду копать дальше.

Вам в целом нужно архитектуру пересмотреть.
Задача контроллера обработать Request, получить из него данные и забыть. А вы же тягаете Request внутри своего ENV зачем-то.
Spring имеет кучу средств по
- получению Bean-объекта из Request через маппинг или ещё как.
- управлению scope, если объект связан с Session или Request.
Вам не нужно самому работать с Servlet API.
...
Рейтинг: 0 / 0
12.12.2012, 13:02:03
    #38075632
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
BlazkowiczВам не нужно самому работать с Servlet API.
изначально от незнания делал свои велосипеды.
согласен что в Спринг все плюшки уже придуманы. осталось только обучиться их правильному использованию. этим и займусь в свободное время. спасибо
...
Рейтинг: 0 / 0
12.12.2012, 13:17:12
    #38075660
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r uладно. щас попробую изменить scope у всех контроллеров на prototype.
чтоб создавались заново всегда. если проблема исчезнет, значит по крайней мере я на правильном пути. и буду копать дальше

Загляни в конфиги - какие пользовательские бины ты прописал в контексте приложения, контексте сервлета. Если внимательно последить за логами Спринга во время деплоя приложения (в режиме отладки), можно заметить, что Спринг их синглтонами обзывает..
Скорее всего какому-то из них активно переписываешь свойства, потом отдаешь в реквест. Получилось вот такое однопользовательское веб-приложение. ))
...
Рейтинг: 0 / 0
12.12.2012, 13:19:13
    #38075663
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r u осталось только обучиться их правильному использованию. этим и займусь в свободное время. спасибо
Без знания архитектуры Спринга, научиться правильно использовать "плюшки" вряд ли получится. Только и останется, что методом копипаста приложения писать..
...
Рейтинг: 0 / 0
12.12.2012, 13:21:19
    #38075670
mesier
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
mesier переписываешь свойства, потом отдаешь в реквест. )
ну в респонс же!
устал что-то к концу дня..
...
Рейтинг: 0 / 0
12.12.2012, 14:31:27
    #38075809
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
r u,

Во первых как тестируешь? Если из под одного браузера одновременно пытаешься тестировать работу нескольких пользователей, то возможно это вообще проблемы браузера.

Второй кусок кода под сомнением это Env env = new Env(request, response); По спецификации объекты Respose и Request валидны только на протяжении обработки запроса. Web контейнер впринципе может использовать пул request\respose.
...
Рейтинг: 0 / 0
12.12.2012, 14:59:23
    #38075879
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк.
vas0Во первых как тестируешь? Если из под одного браузера одновременно пытаешься тестировать работу нескольких пользователей, то возможно это вообще проблемы браузера.

Второй кусок кода под сомнением это Env env = new Env(request, response); По спецификации объекты Respose и Request валидны только на протяжении обработки запроса. Web контейнер впринципе может использовать пул request\respose.
Кеширование экземпляров с учетом современных GC это ущербная стратегия. Вряд ли сервер так делает.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring web mvc. просачивается сессия чужого юзера. подскажите где искать косяк. / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]