Не могу сделать сессионный бин в Spring

0
10 окт 2016 21:10
Есть такой класс
@SessionComponent
public class CustomerUserComponent extends AbstractUserComponent implements Serializable {

    private static final long serialVersionUID = 5055506502916731967L;
    
    private Map<Long, Program> programs = null;

    public CustomerUser getCustomerUser() {
        if (!isAuthenticated()) {
            return null;
        }
        return (CustomerUser) getUser();
    }

    public Map<Long, Program> getAccessiblePrograms() {

        if (programs == null) {
            List<SubscribedProgram> subscribedPrograms = getCustomerUser().getPrograms();

            programs = new HashMap<>();
            if (subscribedPrograms != null) {
                for (SubscribedProgram subscribedProgram : subscribedPrograms) {
                    programs.put(subscribedProgram.getProgram().getId(), subscribedProgram.getProgram());
                }
            }
        }

        return programs;
    }

    public Collection<Program> getAccessibleProgramsAsList() {
        return getAccessiblePrograms().values();
    }

}


Аннотация @SessionComponent описана так:
@Component
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public @interface SessionComponent {

    String value() default "";

}


в web.xml есть строки
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>


В файле настройки бинов присутствует строка
<context:component-scan base-package="com.bakalibriki.components"/>

Она цепляет этот бин, и в контексте он существует. Но инициализируется он только один раз. В начале programs=null, но после того, как я разлогинился и залогинился под другим юзером, programs остаётся заполненным с вытекающими из этого неправильными данными там.

Что я сделал не так или что не сделал как надо?

Ответов: 5

0
12 окт 2016 18:13
Сделал в контроллере session.invalidate() и всё решилось. Спасибо Agny. Но почему-то настройка в XML-конфиге не работает.
0
12 окт 2016 17:38
В файле секьюрити прописано
<security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/"/>

Так, что инвалидация прописана.
0
12 окт 2016 12:27
Подозреваю, что Вы не инвалидируете сессию при разлогинивании.
0
12 окт 2016 08:59
Дамы и господа, выяснилось, я был не прав. Компонент получился вполне сессионный. Попробовал зайти с двух браузеров, оказалось экземпляры компонента создаются разные. Проблема только в том, что при разлогинивании сессия сохраняется и компонент не уничтожается.
Исходя из этого вопрос: что делать, чтобы после разлогинивания залогинившись под другим юзером в сессионном компоненте инициализировались правильные данные?
Тупо обнулять их про логауте или есть какое-то средство уничтожить или переобнулить сессию?
0
12 окт 2016 08:11
Уважаемые!
Есть что добавить?

Я могу не создавать свою аннотацию @SessionComponent, но это так же не работает.

Т.е. я описал класс бина таким образом
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class CustomerUserComponent extends AbstractUserComponent implements Serializable ...


И та же штука. Как создавать сессионные бины в спринге?
Модераторы: wedens
Сейчас эту тему просматривают: Нет