Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
В Spring mvc если у Controller не указать Scope, то по умолчанию он будет singleton, про thread-safe надо позаботится самому, видимо сделать synchronized методы.

@Controller
@RequestMapping(value = "myapp")
public class AppController
{
}


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

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

@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
7 фев 13, 12:21    [13889804]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
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?

Всё это можно делать одновременно для разных юзеров одним классом. Если у вас нельзя, то объясните почему именно.
7 фев 13, 12:28    [13889874]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Вот тут вроде рассматривается как вариант session scope для Controller
http://richardchesterwood.blogspot.com/2011/03/using-sessions-in-spring-mvc-including.html
2: Scope the Controller

Хорошая статья. Pros and Cons расписаны.
7 фев 13, 12:30    [13889894]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Ну вопрос возник по такой причине
У меня есть session scoped объект

@Component
@Scope("session")
public class UserManager
{
     String username;
    String password;     
    User loggedUser;
   ...
   
    public boolean isLogged()
   {
       return loggedUser != null;
   }
}


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

@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.
7 фев 13, 12:43    [13890029]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Ну вопрос возник по такой причине
У меня есть session scoped объект

ОК

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

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

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

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 инжекстить в каждый контроллер и проверять свойство в каждом методе? Копипастом?
7 фев 13, 12:56    [13890183]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Blazkowicz
А как UserManager хранит ссылку на Service+Persistence? А что будет после сериализации и десериализации UserManager?


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

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

Какие преимущества вообще дает этот Spring security - реальные?
7 фев 13, 17:03    [13892710]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
UserManager имеет 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() в КАЖДОМ методе КАЖДОГО контроллера.
- Куча готовых интеграций с существующими механизмами авторизации.
7 фев 13, 17:14    [13892815]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
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 аттрибут?
9 фев 13, 15:21    [13902135]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Я считал, что при перезагрузке сервера - это ж не обычная ситуация, а форс-мажор - все сессии и так должны отключиться, и зачем их восстанавливать после перезагрузки?

Перезагрузка сервера это обычная ситуация. Форс мажор это пожар в датацентре. Считается, как бы, нормальным что перезагрузка сервера должна проходить незаметно для юзера. Поэтому содержимое сессии сериализуется. Либо для того чтобы восстановить состояние после перезагрузки, либо для того чтобы произвести репликацию на кластере.

oson
Почему после десериализации (даже если это необходимо) Service и Repository не будут привязаны к спринговому контексту?

Ваш бин ссылается на сервис, сервис на репозиторий, репозиторий на datasource... Либо это всё не будет сериализоваться вообще. Либо будет сериализоваться, а потом не работать после десериализации.

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


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

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

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

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

Только данные, без ссылок на инфраструктуру.
9 фев 13, 19:53    [13902656]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Честно говоря до конца не понял.
Получается указывать scope session вообще плохо для классов. Но что тогда по поводу JSF?
Там есть специальный layer, называется managed beans. Для каждого такого бина можно указать session или request scope.
Собственно этот подход я взял оттуда. У меня получается между страницей и service layer добавлен manager уровень, которому я указываю Scope Session.
Что по поводу JSF в таком контексте? Там тоже возникают проблемы с сериализацией после перезагрузки сервера?
13 фев 13, 18:40    [13922429]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
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 будет иметь ссылки на инфраструкруру, то возможны проблемы.
13 фев 13, 19:06    [13922529]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Сервер одноклассников можно ребутнуть на 4 мин. и никто не отвалится?
13 фев 13, 20:19    [13922807]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Мне - как это обычно бывает- надо сохранять какие-то введенные данные между запросами.
Сделать какой-то класс session scope - это плохо.
Как мне сохранять введенные данные между запросами?
Устанавливать именно их в сессию как аттрибуты? А сам класс должен быть request scoped?

Может быть Spring webflow как вариант?
13 фев 13, 23:10    [13923300]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Сделать какой-то класс session scope - это плохо.

Слишком много обощений. Всё упирается в то какой именно это класс.
13 фев 13, 23:55    [13923424]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
oson,
Корзина с товаром вроде избитое решение
14 фев 13, 08:00    [13923953]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Лагман
Member

Откуда: Москва
Сообщений: 1090
oson,

Сделать небольшой класс Session Scope не так уж и плохо, он даже обретет возможность синхронизироваться в кластере, вместе с сессией, все ништяки, и ковыряться в атрибутах не надо.
14 фев 13, 12:17    [13925256]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
небольшой...не так уж плохо....вроде бы....))))
Вот тут по-русски про корзину....т.к. нету faq
http://it.vaclav.kiev.ua/2010/12/25/spring-framework-for-beginners-part-10/
14 фев 13, 12:35    [13925416]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Petro123
небольшой...не так уж плохо....вроде бы....))))
Вот тут по-русски про корзину....т.к. нету faq
http://it.vaclav.kiev.ua/2010/12/25/spring-framework-for-beginners-part-10/


Значит делать компонент session scope НЕХОРОШО, и если необходимо сохранять состояние между запросами, то нужен
<aop:scoped-proxy/> - то есть ИММИТАЦИЯ session scope. так чтоли ?
19 фев 13, 00:38    [13945765]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Значит делать компонент session scope НЕХОРОШО

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

oson
, и если необходимо сохранять состояние между запросами, то нужен
<aop:scoped-proxy/> - то есть ИММИТАЦИЯ session scope. так чтоли ?

Нет, это не имитация. :( Это прокси, который ссылается на фактические данные согласно scope. Т.е. если это session scope, то прокси будет искать данные в сессии и т.п.
19 фев 13, 11:49    [13947460]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Почему в статье рекомендуется использовать <aop:scoped-proxy/>? Чем это лучше, чем указать scope Session?
22 фев 13, 19:17    [13968806]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Почему в статье рекомендуется использовать <aop:scoped-proxy/>? Чем это лучше, чем указать scope Session?

Блин, ну с этого же начали тему. Тем что контроллер имеет scope singleton. Она нам не нужен в HttpSession. Он там избыточен. Через него в HttpSession могут попасть не сериализуемые объекты и много чего другого лишнего.
Например у вас Controller имеет ссылку на Repository и Service, тогда вместе с контроллером в HttpSession окажутся и Repository и Service. А у Repository ссылка на DAO, а у DAO на DataSource. И все они вместе не сериализуемы. Из-за этого ни кластеризация, ни персист сессии при штатном ребуте не работают.
22 фев 13, 19:26    [13968831]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
забыл ник
Member

Откуда:
Сообщений: 3370
не говоря о том, что это просто бессмысленно
22 фев 13, 19:34    [13968859]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
забыл ник
не говоря о том, что это просто бессмысленно

oson хочет SingleThreadModel в контроллере. Кстати... scope session ведь не гарантирует SingleThreadModel вообще. Можно в одной сессии конкурентных запросов выслать пачку.
22 фев 13, 19:47    [13968893]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Столько эмоций.
Буду медитировать над сказанным - может пойму зачем сессию через aop указывать.
И насчет SingleThreadModel в контроллере.
Хотелось бы, чтобы был хотя бы Request cope - то есть чтобы быть уверенным, что один инствнц контроллера гарантировано обслуживает один запрос от user.
Ну а в том пункте, что нужно схранять состояние этого клиента между его запросами, я делаю значит некий UserState класс, указываю ему scope prototype

@Component("userState ")
@Scope("prototype")
public class UserState implements Serializable
{
   String loginOfUserInSession;
   String nameOfUserInSession;
}


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

  public String login(final ModelMap modelMap, final HttpSession httpSession)
    {
        httpSession.setAttribute("userState", userState);
    } 

Правильно я понял? Этот userState и будет Value Object.
22 фев 13, 20:29    [13968984]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Хотелось бы, чтобы был хотя бы Request cope - то есть чтобы быть уверенным, что один инствнц контроллера гарантировано
обслуживает один запрос от user.

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

oson
и при логине этого юзера создаю внутри Controller (не Service) класса этот UserState, укладываю его в HttpSession
Правильно я понял? Этот userState и будет Value Object.

Да. Только зачем это всё делать руками?
22 фев 13, 22:11    [13969230]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Уважаемый Blazkowicz, напишите один раз развернуто, не обрывками фраз :)

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

Есть уровни такие - на мой взгляд :
page -> controller -> service -> dao -> database.
Controller состояние не сохраняет, это singleton (ну или prototype, максимум - request scope).
Service - тоже singleton? Service просто предоставляет возможности каких-то вычислений для поданных данных, открывает транзакции, делает запросы через dao в database.
В dao - тоже не место для логики.
Какой делать уровень для бизнес логики, для самого движка?

2.
Blazkowicz
Да. Только зачем это всё делать руками?

А как это делать - объясните ж пожалуйста, а то какие то загадочные фразы.
23 фев 13, 14:29    [13970487]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
pavel_nv
Member

Откуда: NV -> SpB
Сообщений: 261
oson,
Controller(@Controller), Service (@Service), DAO (который @Repository) это все синглтоны, не нужно в них хранить состояние:
обрабатывая страницу нас собственно говоря интересуют только входные и выходные данные, зачем в контроллере хранить информацию, если для это есть HttpSession (он собственно для этого и предназначен)?
В сервисе как раз и находится бизнес логика, например PaymentService.transfer(Account fromAccount, Account toAccount, Double value), в принципе входных параметров достаточно для проведения платежа, лишние поля для сохранения информации тоже не требуется.
У DAO аналогично.
Создание объектов при областях видимости занимает время/ресурсы, будут проблемы с быстродействием.
Если есть необходимость сохранять данные в сессии можно довольно просто написать класс по добавлению/получения в сессию объекта:
- через RequestContextHolder.currentRequestAttributes().getAttribute("user", RequestAttributes.SCOPE_SESSION);
- через HttpSession, который можно получить в методе контроллера

oson
А как это делать - объясните ж пожалуйста, а то какие то загадочные фразы.

Используйте SpringSecurity
23 фев 13, 15:11    [13970565]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Значит SpringSecurity - это не только проверка данных при авторизации и прав на какой-то ресурс, но и сохранение данных в сессии между запросами? То есть то, что в JSF реализуется при помощи session scope для managedBean. Я долго работал с JSF и поэтому пытаюсь в Spring в Spring использовать такой подход с session scope. Видимо это неправильно.
23 фев 13, 20:07    [13971243]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Значит SpringSecurity - это не только проверка данных при авторизации и прав на какой-то ресурс, но и сохранение данных в сессии между запросами? То есть то, что в JSF реализуется при помощи session scope для managedBean. Я долго работал с JSF и поэтому пытаюсь в Spring в Spring использовать такой подход с session scope. Видимо это неправильно.

Всё тоже самое. managedBean\backingBean не является контроллером. Он реализует логику и хранит состояние. Контроллер, по задумке, логику реализовывать не должен. Поэтому он singleton.
23 фев 13, 21:41    [13971470]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Blazkowicz
Member

Откуда:
Сообщений: 24443
oson
Уважаемый Blazkowicz, напишите один раз развернуто, не обрывками фраз :)

Попробуйте сконцентрироваться и задать конкретные вопросы. Трудно отвечать на сообщения вида "мне так кажется".

oson
page -> controller -> service -> dao -> database.
Controller состояние не сохраняет, это singleton (ну или prototype, максимум - request scope).
Service - тоже singleton? Service просто предоставляет возможности каких-то вычислений для поданных данных, открывает транзакции, делает запросы через dao в database.
В dao - тоже не место для логики.
Какой делать уровень для бизнес логики, для самого движка?

Service aka Transaction Script является частью Domain Model и реализует бизнес-логику.
"движком", обычно называют фреймверк или API. Поэтому термин "бизнес логика движка" мне не понятна. У "движка" обычно своя достаточно уникальная логика, которая не относится ни к какой конкретной предметной области.

oson
А как это делать - объясните ж пожалуйста, а то какие то загадочные фразы.

Вы в правильном направлении. Не храните всё подряд в session scope, а только то что там действительно нужно. Нет смысла писать свою security и использовать HttpSession, когда Spring Security уже реализует такой же механизм, а session scope позволяет привязывать данные к сессии.
23 фев 13, 21:58    [13971508]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Буду разбираться с Spring Security.
Бизнес логику обычно реализую в service лайере.
23 фев 13, 23:04    [13971667]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
chpasha
Member

Откуда:
Сообщений: 9556
oson
в service лайере.
в сервисном вруне что ли?
25 фев 13, 13:20    [13976216]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
chpasha
oson
в service лайере.
в сервисном вруне что ли?


????
27 фев 13, 19:35    [13990888]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
chpasha
Member

Откуда:
Сообщений: 9556
oson
chpasha
пропущено...
в сервисном вруне что ли?


????

service лайер это service liar т.е. лгун, врун, брехун.
27 фев 13, 19:41    [13990899]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Service layer - так лучше?
28 фев 13, 13:42    [13993730]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
oson
Service layer - так лучше?

лучше по русски - слой сервисов или бизнес-логики)
28 фев 13, 13:45    [13993761]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Могу по-украински - кому английский не подходит :)
28 фев 13, 13:51    [13993825]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
oson
Могу по-украински - кому английский не подходит :)

дык, алкоголь главное "не мешать" ))))
28 фев 13, 13:54    [13993845]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
chpasha
Member

Откуда:
Сообщений: 9556
oson
Service layer - так лучше?
гораздо
28 фев 13, 14:44    [13994296]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
"Blazkowicz
Подскажите пожалуйста где можно посмотреть пример использования Spring Security для работы с session и хранением в ней Data value.
4 апр 13, 17:54    [14137173]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
WGA
Member

Откуда:
Сообщений: 401
oson
Ну вопрос возник по такой причине
У меня есть session scoped объект

@Component
@Scope("session")
public class UserManager
{
     String username;
    String password;     
    User loggedUser;
   ...
   
    public boolean isLogged()
   {
       return loggedUser != null;
   }
}


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

@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 не указан http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection, то есть singleton по умолчанию, то я не могу сделать inject session scoped UserManager.
........
То есть для этого мой контроллер должен быть session/request scoped.
вообще говоря можно
5 апр 13, 07:45    [14138441]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
oson
Member

Откуда: Одесса, Украина
Сообщений: 1129
Спасибо.
6 апр 13, 21:27    [14145714]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Session scope для Controller?  [new]
Hubertanyan
Member

Откуда:
Сообщений: 15
Доброго времени суток!
При выполнении интеграционных тестов возникает подобная ошибка, только scope области видимости request (@RequestScope)

Scope 'request' 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: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
25 июн 20, 08:59    [22156938]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5395
Hubertanyan,

Так русским по белому написано, что у вас не поднят контекст Request (ну или не виден).
Если это Spring, то надо смотреть, какие контекст поднимается при тесте...
25 июн 20, 12:54    [22157155]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Hubertanyan
Member

Откуда:
Сообщений: 15
mad_nazgul
Hubertanyan,

Так русским по белому написано, что у вас не поднят контекст Request (ну или не виден).
Если это Spring, то надо смотреть, какие контекст поднимается при тесте...


Да, это Spring.
Написано, что "ссылаетесь на атрибуты запроса вне реального веб-запроса, или обрабатываете запрос вне изначально полученного потока", что значит не поднят контекст "Request"? В контексте теста помимо всего прочего также внедряется/поднимается бин(тот, который помечен как @RequestScope). При запуске теста конкретно по классу (по одному классу интеграционного теста) - тесты выполняются. Если же запускать тесты "пакетно" (в пакете несколько интеграционных тестов ) - тесты не выполняются.
25 июн 20, 15:25    [22157249]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5395
Hubertanyan
mad_nazgul
Hubertanyan,

Так русским по белому написано, что у вас не поднят контекст Request (ну или не виден).
Если это Spring, то надо смотреть, какие контекст поднимается при тесте...


Да, это Spring.
Написано, что "ссылаетесь на атрибуты запроса вне реального веб-запроса, или обрабатываете запрос вне изначально полученного потока", что значит не поднят контекст "Request"? В контексте теста помимо всего прочего также внедряется/поднимается бин(тот, который помечен как @RequestScope). При запуске теста конкретно по классу (по одному классу интеграционного теста) - тесты выполняются. Если же запускать тесты "пакетно" (в пакете несколько интеграционных тестов ) - тесты не выполняются.


Что значит "запускать пакетно"?
Вы под gradle или maven запускаете тесты?
Если да, то надо смотреть настройки запуска тестов под системами сборки.

Т.к. вы говорите, что в "одиночном" режиме тест проходит. То скорее всего, что при "пакетном" режиме тест выполняется в другом контексте, чем при одиночном. Скорее всего более специализированном. Например @DataJpaTest (это просто предположение).

Сообщение было отредактировано: 26 июн 20, 09:26
26 июн 20, 09:28    [22157601]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Hubertanyan
Member

Откуда:
Сообщений: 15
mad_nazgul
Hubertanyan
пропущено...


Да, это Spring.
Написано, что "ссылаетесь на атрибуты запроса вне реального веб-запроса, или обрабатываете запрос вне изначально полученного потока", что значит не поднят контекст "Request"? В контексте теста помимо всего прочего также внедряется/поднимается бин(тот, который помечен как @RequestScope). При запуске теста конкретно по классу (по одному классу интеграционного теста) - тесты выполняются. Если же запускать тесты "пакетно" (в пакете несколько интеграционных тестов ) - тесты не выполняются.


Что значит "запускать пакетно"?
Вы под gradle или maven запускаете тесты?
Если да, то надо смотреть настройки запуска тестов под системами сборки.

Т.к. вы говорите, что в "одиночном" режиме тест проходит. То скорее всего, что при "пакетном" режиме тест выполняется в другом контексте, чем при одиночном. Скорее всего более специализированном. Например @DataJpaTest (это просто предположение).


Тесты запускаются через maven и через конфигурацию JUnit - в "одиночном" режиме тест проходит. Так при "пакетном" режиме тест должен поднимать тот же контекст, который указан в самом тесте?
26 июн 20, 10:43    [22157657]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5395
Hubertanyan
mad_nazgul
пропущено...


Что значит "запускать пакетно"?
Вы под gradle или maven запускаете тесты?
Если да, то надо смотреть настройки запуска тестов под системами сборки.

Т.к. вы говорите, что в "одиночном" режиме тест проходит. То скорее всего, что при "пакетном" режиме тест выполняется в другом контексте, чем при одиночном. Скорее всего более специализированном. Например @DataJpaTest (это просто предположение).


Тесты запускаются через maven и через конфигурацию JUnit - в "одиночном" режиме тест проходит. Так при "пакетном" режиме тест должен поднимать тот же контекст, который указан в самом тесте?


А вот это не факт.
Иногда наблюдал, что тест работающий в IDEA и тест работающий в maven это немного разные тесты.
Связано это с тем, что IDEA "умная" и немного по своему собирает артефакты.

Попробуйте запустить одиночный тест через maven, посмотреть что получиться.
26 июн 20, 11:44    [22157695]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Hubertanyan
Member

Откуда:
Сообщений: 15
mad_nazgul
Hubertanyan
пропущено...


Тесты запускаются через maven и через конфигурацию JUnit - в "одиночном" режиме тест проходит. Так при "пакетном" режиме тест должен поднимать тот же контекст, который указан в самом тесте?


А вот это не факт.
Иногда наблюдал, что тест работающий в IDEA и тест работающий в maven это немного разные тесты.
Связано это с тем, что IDEA "умная" и немного по своему собирает артефакты.

Попробуйте запустить одиночный тест через maven, посмотреть что получиться.


Через maven в "одиночном" режиме тест тоже проходит.
26 июн 20, 12:13    [22157711]     Ответить | Цитировать Сообщить модератору
 Re: Session scope для Controller?  [new]
Hubertanyan
Member

Откуда:
Сообщений: 15
Удалось успешно запустить тесты пакетно при помощи добавления
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);


в инициализацию контекста тестов.
28 июн 20, 20:22    [22158668]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Java Ответить