Session Problem

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Session Problem

Sebastián Perez Escribano
Hi list, I have a problem with the login session in my site. I'm using
Seaside and Shore Components. The main component of the site has two
divs, a menu to the left, and the main page to the right. On the menu I
use anchors that on click show different components in the main page
(via AJAX). The thing is that when the session expires, I need to go
back to the login page. I've overridden the method #incomingRequest: to
check if the session is active and redirect it to the login page if
needed to. Here's the code to do that:

MySession >> incomingRequest: aRequest

 ^self checkIsActive
             ifTrue: [super incomingRequest: aRequest]
             ifFalse:  [self logOut: aRequest]]

MySession >> logOut: aRequest
   | wttHome |
  wttHome := self parent baseUrl asString.
 ^WAResponse redirectTo: wttHome

This works with the components in the main page, for example:  in the
main div I have a component with a button. If I click on the button and
the session isn't active, the session redirects to the log in component,
cleaning all the page. _But when I click on the anchors in the left div
(the menu) and the session isn't active,  the log-in component  is
placed on the right div (the main component) and does not refresh all
the page (the menu still shows). So in this case I end up with a menu on
the left with anchors and the log-in component in the rigth, and i don't
want the menu component showing in this case.

This is the method that is called when I click on an anchor in the left
menu div.

WAMyLeftMenu >> updaterOn: html for: component
 "This is the method with problems"
 ^(html updater)
     id: 'mainComponent';
     callback: [:renderer | self showMainComponent: component on: renderer]

If the session  isn´t active, the callback is never called.

Anyone has any experience dealing with expired (via time-out or by code)
sessions and how to reacting to it (redirecting, logging out, etc)?
Any help on this will be appreciated.

Cheers, Sebastian.
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Session Problem

John McKeon
I put a subclass of WATask on the front end to solve all that: One instance variable to holds an FBPLogin component (subclass of WAComponent)
 
FBPTask >> initialize
   dialog := FBPDialog new
 
FBPTask >> go
 | x | 
 [ (x := self call: dialog) notNil ] whileFalse: [ ].   "dialog answers a user object or nil"
 self session userisregistered                          "userisregistered is a custom method of my WASession subclass"
  ifTrue: [
   dialog login: nil.                                       
   self call: FBPPoolComponent new.          "call the main page"
   dialog login: FBPPlayer new.                  "the main page anwers when the user explicitly logs out via a logout link; and we go back to GO (collect $200)"
   ].
 
So it just keeps calling the login component until a successful login after which it calls the main component and when that component "answers" it sets the login component's to a new user and waits for another successful login.
 
If the user clicks anything after the session is expired, the server reverts to the root which in turn calls go again and starts the whole process over. WATask is handy for this sort of thing.
 


On Thu, Dec 4, 2008 at 11:57 AM, Sebastián Perez Escribano <[hidden email]> wrote:
Hi list, I have a problem with the login session in my site. I'm using Seaside and Shore Components. The main component of the site has two divs, a menu to the left, and the main page to the right. On the menu I use anchors that on click show different components in the main page (via AJAX). The thing is that when the session expires, I need to go back to the login page. I've overridden the method #incomingRequest: to check if the session is active and redirect it to the login page if needed to. Here's the code to do that: 

MySession >> incomingRequest: aRequest

^self checkIsActive
           ifTrue: [super incomingRequest: aRequest]
           ifFalse:  [self logOut: aRequest]]

MySession >> logOut: aRequest
 | wttHome |
 wttHome := self parent baseUrl asString.
^WAResponse redirectTo: wttHome

This works with the components in the main page, for example:  in the main div I have a component with a button. If I click on the button and the session isn't active, the session redirects to the log in component, cleaning all the page. _But when I click on the anchors in the left div (the menu) and the session isn't active,  the log-in component  is placed on the right div (the main component) and does not refresh all the page (the menu still shows). So in this case I end up with a menu on the left with anchors and the log-in component in the rigth, and i don't want the menu component showing in this case.

This is the method that is called when I click on an anchor in the left menu div.

WAMyLeftMenu >> updaterOn: html for: component
"This is the method with problems"
^(html updater)
   id: 'mainComponent';
   callback: [:renderer | self showMainComponent: component on: renderer]

If the session  isn´t active, the callback is never called.

Anyone has any experience dealing with expired (via time-out or by code) sessions and how to reacting to it (redirecting, logging out, etc)?
Any help on this will be appreciated.

Cheers, Sebastian.
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside


_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside