powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Session scope для Controller?
25 сообщений из 50, страница 1 из 2
Session scope для Controller?
    #38141458
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Spring mvc если у Controller не указать Scope, то по умолчанию он будет singleton, про thread-safe надо позаботится самому, видимо сделать synchronized методы.

Код: java
1.
2.
3.
4.
5.
@Controller
@RequestMapping(value = "myapp")
public class AppController
{
}



Можно указать "prototype".

А почему собственно не указать " session " scope?

Код: java
1.
2.
3.
4.
5.
6.
@Controller
@Scope("session")
@RequestMapping(value = "myapp")
public class AppController
{
}


Тогда к каждой сессии юзера будет привязан один контроллер, который будет перенаправлять его по нужным url.
И проверять удобно, залогинившийся юзер пытается перейти к url или еще нет и вернуть на страницу login.
Зачем обязательно делать Controller singleton или prototype?

Вот тут вроде рассматривается как вариант session scope для Controller
http://richardchesterwood.blogspot.com/2011/03/using-sessions-in-spring-mvc-including.html
2: Scope the Controller
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38141477
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonВ Spring mvc если у Controller не указать Scope, то по умолчанию он будет singleton
Что совершенно логично с точки зрения роли Controller в MVC и совершенно традиционно и аналогично реализации Servlet.

osonпро thread-safe надо позаботится самому, видимо сделать synchronized методы.
Офигеть решение. И пусть все юзеры выстраиваются в очередь. Нехрен всем сразу на сервер лезть.

osonА почему собственно не указать " session " scope?

Потому что в сессии хранят конкретные данные - модель предметной области. Задача Controller конвертировать ввод в модель предметной области, делегировать обработку бизнес логике и возвращать нужный View.
Вводя состояние в контроллер мы как бы нарушам Single Responsibility Principle.

osonТогда к каждой сессии юзера будет привязан один контроллер, который будет перенаправлять его по нужным url.
И проверять удобно, залогинившийся юзер пытается перейти к url или еще нет и вернуть на страницу login.
Зачем обязательно делать Controller singleton или prototype?

Всё это можно делать одновременно для разных юзеров одним классом. Если у вас нельзя, то объясните почему именно.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38141478
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonВот тут вроде рассматривается как вариант session scope для Controller
http://richardchesterwood.blogspot.com/2011/03/using-sessions-in-spring-mvc-including.html
2: Scope the Controller
Хорошая статья. Pros and Cons расписаны.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38141509
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вопрос возник по такой причине
У меня есть session scoped объект

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Component
@Scope("session")
public class UserManager
{
     String username;
    String password;     
    User loggedUser;
   ...
   
    public boolean isLogged()
   {
       return loggedUser != null;
   }
}



Когда user залогинился, этот UserManager делает запрос через service в бд и если такой user есть то сохраняет его как свое поле.
Теперь когда user переходит по другим линкам, я хочу проверять, есть ли этот loggedUser еще или нет.
Поэтому удобно сделать

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Controller
@RequestMapping(value = myapp)
public class AppController
{
  @Inject
  UserManager userManager;
  @RequestMapping(value = "url-page1", method = RequestMethod.GET)
    public String adminDesktop()
    {

        if(!userManager.isLogged())
        {
            return "login-page";
        }
        return "page1";    

}



Но если у Controller не указан scope, то есть singleton по умолчанию, то я не могу сделать inject session scoped UserManager.

Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread ? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet...

То есть для этого мой контроллер должен быть session/request scoped.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38141550
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonНу вопрос возник по такой причине
У меня есть session scoped объект

ОК

osonКогда user залогинился, этот UserManager делает запрос через service в бд и если такой user есть то сохраняет его как свое поле.
Теперь когда user переходит по другим линкам, я хочу проверять, есть ли этот loggedUser еще или нет.

А как UserManager хранит ссылку на Service+Persistence? А что будет после сериализации и десериализации UserManager?

osonПоэтому удобно сделать

Код: java
1.
2.
3.
4.
public class AppController
{
  @Inject
  UserManager userManager;


Этот вариант тоже описан в той статье, на которую выше приведена ссылка. Только что-то она издохла. Надеюсь временно.

osonНо если у Controller не указан scope, то есть singleton по умолчанию, то я не могу сделать inject session scoped UserManager.

В ошибке указны несколько вероятных причин, но вы почему-то выделили только одну.


автор Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton ; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread ? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet ...


авторТо есть для этого мой контроллер должен быть session/request scoped.
Нет, не обязательно.

Ну, и в целом. Вы изобретаете заново Spring Security? Security вообще проще реализовать через AOP (фильтры, интерцепторы), иначе вам необходимо UserManager инжекстить в каждый контроллер и проверять свойство в каждом методе? Копипастом?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38142146
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА как UserManager хранит ссылку на Service+Persistence? А что будет после сериализации и десериализации UserManager?

UserManager имеет inject service класса, а тот имеет inject repository класса (Spring Data Jpa).

По поводу Spring Security. Мне представляется надежнее самому прописать в нужных местах проверки залогинившегося юзера, какие он имеет права. И проще наверное, чем писать кучу конфигурационных файлов.

Какие преимущества вообще дает этот Spring security - реальные?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38142180
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonUserManager имеет inject service класса, а тот имеет inject repository класса (Spring Data Jpa).

Ну, то есть. Положили UserManager в сессию. Остановили сервер. Сервер сериализовал UserManager на диск. (В вашем случае тупо обрыгался, потому что UserManager не Serializable). Но допустим мы сделали его Serializable.
Запустили сервер. Тот прочитал UserManager с диска, восстановил сессию. И что у нас там стало с Service и Repository? Они ведь уже не привязаны к новому спринговому контексту.
Внимательно перечитайте статью. В вашем случае сервер будет пытаться сериализовать UserManager со всеми его сервисами, репозиториями и, возможно, вообще полным спринговым контекстом.
Т.е. на продакшн сервере, при ребуте все клиентские сессии умирают это раз.
Кластеризация с репликацией сессии становится не возможно это два.
А если мы сделаем ссылки транзиентными, то они будут обнулятся.
По-хорошему нужно переопределить десериализацию и восстанавливать ссылки на классы контекста при чтении объектов сессии из байт.
Но ведь гораздо проще хранить тупые Value Object в сессии и не заморачиваться с ссылками.


osonПо поводу Spring Security. Мне представляется надежнее самому прописать в нужных местах проверки залогинившегося юзера, какие он имеет права.

Надежнее? "в нужных местах"? Т.е. у вас два-три метода секурные, остальные все публичные?

osonИ проще наверное, чем писать кучу конфигурационных файлов.

Это называется тупо лень изучать что-то новое.

osonКакие преимущества вообще дает этот Spring security - реальные?
По сравнению с вашим подходом?
- Готовое AOP, не нужно ничего городить в КАЖДОМ методе КАЖДОГО контроллера. В конфиге замапили пути на роли и забыли.
- Авторизации у вас пока нет. Только аутентификация. При появляении авторизации, придется менять isLoggedIn на hasRole() в КАЖДОМ методе КАЖДОГО контроллера.
- Куча готовых интеграций с существующими механизмами авторизации.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38144428
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНу, то есть. Положили UserManager в сессию. Остановили сервер. Сервер сериализовал UserManager на диск. (В вашем случае тупо обрыгался, потому что UserManager не Serializable). Но допустим мы сделали его Serializable.
Запустили сервер. Тот прочитал UserManager с диска, восстановил сессию. И что у нас там стало с Service и Repository? Они ведь уже не привязаны к новому спринговому контексту.
Я считал, что при перезагрузке сервера - это ж не обычная ситуация, а форс-мажор - все сессии и так должны отключиться, и зачем их восстанавливать после перезагрузки?
Почему после десериализации (даже если это необходимо) Service и Repository не будут привязаны к спринговому контексту?

BlazkowiczВнимательно перечитайте статью. В вашем случае сервер будет пытаться сериализовать UserManager со всеми его сервисами, репозиториями и, возможно, вообще полным спринговым контекстом.
Т.е. на продакшн сервере, при ребуте все клиентские сессии умирают это раз.
Кластеризация с репликацией сессии становится не возможно это два.
А если мы сделаем ссылки транзиентными, то они будут обнулятся.

то есть в случае, если UserManager имеет scope "session"?
Я не понял, почему из сериализации следуют такие выводы : Blazkowiczпри ребуте все клиентские сессии умирают это раз.
Кластеризация с репликацией сессии становится не возможно это два.

BlazkowiczПо-хорошему нужно переопределить десериализацию и восстанавливать ссылки на классы контекста при чтении объектов сессии из байт.
Что значит "переопределить десериализацию и восстанавливать ссылки на классы контекста при чтении объектов сессии из байт".
То есть переопределить поведение интерфейса Serializable?


BlazkowiczНо ведь гораздо проще хранить тупые Value Object в сессии и не заморачиваться с ссылками.

Сорри, не понял - про какие тупые Value Object идет речь?
Что значит хранить в сессии - то есть не делать scope "Session", а получить доступ к объекту HttpSession и положить туда объекты как аттрибуты? Тут есть различие - указать scope session для класса или попложить в HttpSession аттрибут?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38144609
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonЯ считал, что при перезагрузке сервера - это ж не обычная ситуация, а форс-мажор - все сессии и так должны отключиться, и зачем их восстанавливать после перезагрузки?
Перезагрузка сервера это обычная ситуация. Форс мажор это пожар в датацентре. Считается, как бы, нормальным что перезагрузка сервера должна проходить незаметно для юзера. Поэтому содержимое сессии сериализуется. Либо для того чтобы восстановить состояние после перезагрузки, либо для того чтобы произвести репликацию на кластере.

oson Почему после десериализации (даже если это необходимо) Service и Repository не будут привязаны к спринговому контексту?
Ваш бин ссылается на сервис, сервис на репозиторий, репозиторий на datasource... Либо это всё не будет сериализоваться вообще. Либо будет сериализоваться, а потом не работать после десериализации.

osonЯ не понял, почему из сериализации следуют такие выводы : Blazkowiczпри ребуте все клиентские сессии умирают это раз.
Кластеризация с репликацией сессии становится не возможно это два.

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

osonЧто значит "переопределить десериализацию и восстанавливать ссылки на классы контекста при чтении объектов сессии из байт".
То есть переопределить поведение интерфейса Serializable?

Если объект в сессии имеет ссылку на контекст, то после ребута у приложения будет новый контекст. Нужно все объекты сессии линковать на новый котекст. Через Externalizable. Но это сложный путь. Проще не держать таких ссылок.

osonСорри, не понял - про какие тупые Value Object идет речь?

Только данные, без ссылок на инфраструктуру.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150120
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря до конца не понял.
Получается указывать scope session вообще плохо для классов. Но что тогда по поводу JSF?
Там есть специальный layer, называется managed beans. Для каждого такого бина можно указать session или request scope.
Собственно этот подход я взял оттуда. У меня получается между страницей и service layer добавлен manager уровень, которому я указываю Scope Session.
Что по поводу JSF в таком контексте? Там тоже возникают проблемы с сериализацией после перезагрузки сервера?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150157
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonЧестно говоря до конца не понял.
Так спрашивайте конкретно что не понятно?

osonПолучается указывать scope session вообще плохо для классов. Но что тогда по поводу JSF?
Ну, как бы да. Не то чтобы совсем "плохо". Просто этот процесс нужно контролировать, чтобы в session scope не попало всё подряд.

osonТам есть специальный layer, называется managed beans.
Для каждого такого бина можно указать session или request scope.

В JSF вообще ничего просто не бывает.
Managed они называются потому что их жизненым циклом управляет JSF контейнер.
Обычно это Value Objects без ссылок на сервисы, DOA и т.п.

osonСобственно этот подход я взял оттуда. У меня получается между страницей и service layer добавлен manager уровень, которому я указываю Scope Session.
Что по поводу JSF в таком контексте? Там тоже возникают проблемы с сериализацией после перезагрузки сервера?
Если у вас session scope managed bean будет иметь ссылки на инфраструкруру, то возможны проблемы.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150249
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер одноклассников можно ребутнуть на 4 мин. и никто не отвалится?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150396
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне - как это обычно бывает- надо сохранять какие-то введенные данные между запросами.
Сделать какой-то класс session scope - это плохо.
Как мне сохранять введенные данные между запросами?
Устанавливать именно их в сессию как аттрибуты? А сам класс должен быть request scoped?

Может быть Spring webflow как вариант?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150420
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonСделать какой-то класс session scope - это плохо.

Слишком много обощений. Всё упирается в то какой именно это класс.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150533
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
Корзина с товаром вроде избитое решение
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150911
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,

Сделать небольшой класс Session Scope не так уж и плохо, он даже обретет возможность синхронизироваться в кластере, вместе с сессией, все ништяки, и ковыряться в атрибутах не надо.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38150962
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
небольшой...не так уж плохо....вроде бы....))))
Вот тут по-русски про корзину....т.к. нету faq
http://it.vaclav.kiev.ua/2010/12/25/spring-framework-for-beginners-part-10/
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38156611
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123небольшой...не так уж плохо....вроде бы....))))
Вот тут по-русски про корзину....т.к. нету faq
http://it.vaclav.kiev.ua/2010/12/25/spring-framework-for-beginners-part-10/

Значит делать компонент session scope НЕХОРОШО, и если необходимо сохранять состояние между запросами, то нужен
<aop:scoped-proxy/> - то есть ИММИТАЦИЯ session scope. так чтоли ?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38157073
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonЗначит делать компонент session scope НЕХОРОШО

У вас только ЧЕРНОЕ и БЕЛОЕ. Что такое "компонент"? По ссылки Value Object - shoppingCart и Controller - shoppingCartController. Одно хранится в сессии, второе - нет.

oson, и если необходимо сохранять состояние между запросами, то нужен
<aop:scoped-proxy/> - то есть ИММИТАЦИЯ session scope. так чтоли ?
Нет, это не имитация. :( Это прокси, который ссылается на фактические данные согласно scope. Т.е. если это session scope, то прокси будет искать данные в сессии и т.п.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162763
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в статье рекомендуется использовать <aop:scoped-proxy/>? Чем это лучше, чем указать scope Session?
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162774
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonПочему в статье рекомендуется использовать <aop:scoped-proxy/>? Чем это лучше, чем указать scope Session?
Блин, ну с этого же начали тему. Тем что контроллер имеет scope singleton. Она нам не нужен в HttpSession. Он там избыточен. Через него в HttpSession могут попасть не сериализуемые объекты и много чего другого лишнего.
Например у вас Controller имеет ссылку на Repository и Service, тогда вместе с контроллером в HttpSession окажутся и Repository и Service. А у Repository ссылка на DAO, а у DAO на DataSource. И все они вместе не сериализуемы. Из-за этого ни кластеризация, ни персист сессии при штатном ребуте не работают.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162784
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не говоря о том, что это просто бессмысленно
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162800
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никне говоря о том, что это просто бессмысленно
oson хочет SingleThreadModel в контроллере. Кстати... scope session ведь не гарантирует SingleThreadModel вообще. Можно в одной сессии конкурентных запросов выслать пачку.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162825
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столько эмоций.
Буду медитировать над сказанным - может пойму зачем сессию через aop указывать.
И насчет SingleThreadModel в контроллере.
Хотелось бы, чтобы был хотя бы Request cope - то есть чтобы быть уверенным, что один инствнц контроллера гарантировано обслуживает один запрос от user.
Ну а в том пункте, что нужно схранять состояние этого клиента между его запросами, я делаю значит некий UserState класс, указываю ему scope prototype

Код: java
1.
2.
3.
4.
5.
6.
7.
@Component("userState ")
@Scope("prototype")
public class UserState implements Serializable
{
   String loginOfUserInSession;
   String nameOfUserInSession;
}



и при логине этого юзера создаю внутри Controller (не Service) класса этот UserState, укладываю его в HttpSession

Код: java
1.
2.
3.
4.
  public String login(final ModelMap modelMap, final HttpSession httpSession)
    {
        httpSession.setAttribute("userState", userState);
    } 


Правильно я понял? Этот userState и будет Value Object.
...
Рейтинг: 0 / 0
Session scope для Controller?
    #38162891
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonХотелось бы, чтобы был хотя бы Request cope - то есть чтобы быть уверенным, что один инствнц контроллера гарантировано
обслуживает один запрос от user.

Это имеет смысл если всю логику писать в контроллере. Тогда появятся поля, состояния и т.п. Если слоёв на сервере больше, то кроме контроллера, ведь, и другие станут scope request.

osonи при логине этого юзера создаю внутри Controller (не Service) класса этот UserState, укладываю его в HttpSession
Правильно я понял? Этот userState и будет Value Object.
Да. Только зачем это всё делать руками?
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Session scope для Controller?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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