artemb
artemb

Reputation: 9371

How to do something on session start in Spring MVC?

I need to initialize every new http session with some values. How do I do that?

I tried to create a session-scoped component and initializing session in @PostConstruct, but session-scoped beans are not eagerly created until I request access them.

Upvotes: 5

Views: 3068

Answers (1)

Bozho
Bozho

Reputation: 597016

If you are absolutely certain that your want eager initialization, you can do the following:

  • define an interceptor for all beans
  • defina a <lookup-method> for that interceptor:

    <lookup-method name="getCurrentSessionBean"
         bean="yourSessionBeanToInitialize"/>
    
  • define the interceptor abstract, with an abstract method getCurrentSessionBean()

  • create a flag initialized on the bean
  • on each interception, call the lookup method and it will return an instance of the bean from the current session. If it is not initialized (the flag), initialize it
  • you can also use @PostConstruct and spare the initizlied flag

Another option is to:

  • define a HttpSessionListener in web.xml (or with annotations if using servlet 3.0)
  • use WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) to obtain the context
  • call getBean(..) to get an instance of the session-scoped bean
  • it will be initialized with @PostConstruct at that point

The first option is "more spring", the second is easier and faster to implement.

Upvotes: 3

Related Questions