my dog learned polymorphism*
The moose likes JSP and the fly likes preventing a JSP bean instance from being shared by multiple users Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » JSP
Bookmark "preventing a JSP bean instance from being shared by multiple users" Watch "preventing a JSP bean instance from being shared by multiple users" New topic
Author

preventing a JSP bean instance from being shared by multiple users

Steve Simon
Greenhorn

Joined: Jan 28, 2012
Posts: 12
Hi guys,

THE SITUATION:
I am following an example in a college text book.
The example is a simple web application for a online bakery.
Basically, you have a jsp showing a selection of baked goods which have been read from a database.
If you click on one of those items (which is a hyperlink), it adds the name of that item to
a 'cartBean' bean and reloads the page to display a table (the Cart) with the newly chosen item inside.
New items can be added to the cart in the same way, and the cart will accumulate all your chosen items.
Its really very simple.
Now, the example suggests (and I presume) that the only way to ensure the cartBean keeps
its contents (without being emptied) is to ensure that the scope="session"/"application".
If scope="page" is specified, a new bean instance will be created every time an item is added
to the cart meaning that there will only ever be max 1 item in the cart at all times.

THE PROBLEM:
Since the cartBeans scope needs to = "session", it means that the same cartBean
session is shared between multiple users! So, if user A loads the web page, and adds three items
to their cart, and then user B loads the web page, user B will see those three items have already
been loaded into their cart even though their cart should be empty.
I understand that bean sharing may be useful (at times), but in this case it is not what I'm looking for.

WHAT I'M LOOKING FOR:
I want a new bean instance to be created for each user. Furthermore, is it possible to destroy that
bean instance when a user leaves the web site?

I sincerely apologise if this has been covered before. If so, please forward me in the right direction.

Thanks
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19653
    
  18

Steve Simon wrote:Since the cartBeans scope needs to = "session", it means that the same cartBean session is shared between multiple users! So, if user A loads the web page, and adds three items
to their cart, and then user B loads the web page, user B will see those three items have already been loaded into their cart even though their cart should be empty.

No it doesn't. Session scope means the attributes are shared by all requests of the same session. Unless you explicitly attempt to hijack a session, each user gets its own session. User B will get a different session and therefore different attributes.

What you describe would be true if you used application scope.

Furthermore, is it possible to destroy that bean instance when a user leaves the web site?

When the session is invalidated (due to inactivity or done manually), all attributes inside the session are discarded as well.


SCJP 1.4 - SCJP 6 - SCWCD 5 - OCEEJBD 6
How To Ask Questions How To Answer Questions
Steve Simon
Greenhorn

Joined: Jan 28, 2012
Posts: 12
Hi Rob, thanks for the response.

I think where I got confused is that I assumed that the [application server/ JVM / whatever entity is responsible] would create a new session every time I open the same website from the same computer.
As it turns out, the session continues to remain active because the same bean is used.

HERE IS A SIMPLE EXAMPLE:

THE BEAN


THE JSP


If you run the above application, and click the reload button on the browser 2 times. The number increments by 1 until it gets to 3.
Run the application again (opening up a second tab on the browser), and click the reload button 4 times. The number increments by 1 until it gets to 5.
So far so good.
Now, go back to the first tab that was opened and click reload.
The number now jumps from 3 to 6.

This illustrates to me that the same session (and bean instance) is being used by both tabs.

Am I correct in saying that the application server or JVM can provide maximum ONE session for each client?

Thanks again!


Bear Bibeault
Author and ninkuma
Marshal

Joined: Jan 10, 2002
Posts: 60782
    
  65

Sessions are maintained by cookies. Anything that shares a cookie, will share a session.

It's not a realistic scenario that two users will be using the same web app from two different tabs of the same browser instance.


[Asking smart questions] [Bear's FrontMan] [About Bear] [Books by Bear]
Steve Simon
Greenhorn

Joined: Jan 28, 2012
Posts: 12
Ok thanks for your help guys.
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19653
    
  18

You're welcome :)
Stefan Evans
Bartender

Joined: Jul 06, 2005
Posts: 1016
As Bear mentioned, different browser tabs will share the same browser session, and thus the same cookie.
If you really want to test it in two different sessions try
- two completely different browsers (I use Firefox and IE a whole lot for this)
- In IE open up a new browser using File:New Session

Steve Simon
Greenhorn

Joined: Jan 28, 2012
Posts: 12
Thanks Stefan, using different browsers does the trick :)

Actually I think what was confusing me right in the beginning was the way that Google Chrome was handling my application (so this was more of a browser issue than anything else)
I realised that Chrome keeps the session running in the background even if you close the browser completely. So if you launch the application again (before the maxInactiveInterval is reached) the previous session will be restored.
Although this can obviously be resolved by using the setMaxInactiveInterval() method on the session object, a cleaner way is to go to advanced options and:
- 'under the bonnet', deselect 'continue running background apps when Google is closed'.
- go to 'privacy' and 'clear browsing data' (make sure 'delete' cookies' is checked).
Alternatively, you can just redeploy your application every time.
I just checked, and neither Firefox, nor IE have this problem by default.

But, its good to hear from people who probably have more experience than me that a particular requirement (such as the one I was looking for) is probably not a 'realistic requirement'.
It was just annoying when I was trying to test the application and I wasn't getting 'fresh' beans each time...


 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: preventing a JSP bean instance from being shared by multiple users
 
Similar Threads
My SCEA Part 1Study Notes
Stateful Session Bean - Conversational State
SFSB or SLSB?
HttpSession
Stateful Session and Shopping Cart