I’ve run into a strange problem with Coldbox’s SessionStart
interception point that I believe may be a race condition error. Unfortunately, the problem is very tricky to replicate and only seems to happen 5% of the time I try it, and 50% of the time one of my clients tries it.
I’m building one of those “RememberMe” pieces of functionality that looks for a special cookie when a new session starts to see if the user should automatically be logged in. I’ve accomplished this by using an interceptor like this:
component {
property name="rememberMeService" inject="provider:rememberMeService";
property name="auth" inject="provider:authenticationService@cbauth";
/**
* SessionStart
* Triggers when a new session begins
*
* @sessionStruct
*/
function sessionStart( sessionStruct ) {
// if the user has a cookie on their machine called remember me
if ( cookie.keyExists( "rememberMe" ) ) {
try {
var user = rememberMeService.recallMe();
if ( user.isLoaded() ) {
auth.login( user );
}
} catch( InvalidToken e ) {
structDelete( cookie, "rememberMe" );
}
}
}
The interceptor’s sessionStart()
method is pretty straightforward. I have Wirebox inject a RememberMeService
with the provider:
notation to ensure everything is available when this interceptor fires.
I won’t post the RememberMeService
for sake of brevity, but it does have a dependency of qb
(Query Builder) which is ultimately injected into a RememberMeDao
via Wirebox like this:
property name="qb" inject="provider:QueryBuilder@qb";
Here’s the error I get periodically (when the application first starts up):
Weird right? I know for a fact that QueryBuilder exists, and everything works great when you hit “refresh”. The problem only occurs randomly when the application first starts up again.
The only workaround I can think of is to set my application timeout extremely high so the app never times out. However, I’d like to see if there’s a better way to solve this problem. If anyone has any tips or ideas for troubleshooting, I would love to hear it!