[Seaside] [how to?] sesssion expiration

Avi Bryant avi at beta4.com
Tue Jan 20 20:42:35 CET 2004

On Jan 20, 2004, at 8:35 AM, Vaidas Didzbalis wrote:

> Hello,
> I do not understang usage of isolate: ...
> How to modify Counter example, if I want user not be able press back 
> and  submit if value of counder is greater then 10?

Well, you can't quite use #isolate: for that, but you can use the 
underlying WATransaction mechanism.  First let me give an example of 
what that would look like, then I'll try to explain:

WAComponent subclass: #WACounter
	instanceVariableNames: 'count txn'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Seaside/Examples-Test'

	self session registerObjectForBacktracking: self.
	count _ 0.
          "new code"
          txn _ WATransaction new.
	self session addFilter: txn

	count _ count + 1.
          count > 10 ifTrue: [self session removeFilter: txn.  txn 

What does this do?  Well, the session keeps a stack of "filters" that 
you can add to or remove from.  Whenever a new page is generated, part 
of the information that is recorded about it is what the active filter 
objects are.  When someone tries to use that page, their request first 
passes through whichever filters were active.  In this case, we are 
putting an instance of WATransaction on the filter stack for the period 
between the counter being created and the counter reaching 10.  That 
means that any interactions with any pages generated in that time will 
have to pass through the WATransaction.

What WATransaction does is very simple.  At first, it lets all requests 
through, and they get processed normally.  However, once you send it 
#close, it will refuse any requests using WASession>>pageExpired.  
Since we close the txn once we hit 10, then any attempts to use the 
pages generated before we hit 10 will fail.

#isolate: is just a convenience wrapper around this - if you look at 
its implementation you'll find it straightforward.

More information about the Seaside mailing list