Re: Close Browser Behavior

2014-03-17 Thread Daniela L
Hi,
I have solved the problem, overriding valueUnbound in my custom session and
updating the database
with my @SpringBeans works when the session is expiring. My problem was
that I was using data
from my session in the @Repository Dao impl class like this:
MyCustomSession.get() and that issued the There is no application attached
to current thread ContainerBackgroundProcessor exception.
Many thanks for the help.
Best regards
Daniela


2014-03-14 14:51 GMT+01:00 Daniela L danigal...@gmail.com:

 Hi Martin,
 it is definitely a problem in my code :-))
 But unfortunately I do not understand how to update the database at that
 stage using
 @SpringBean? Is that impossible? Do I have to do this outside Wicket using
 a HttpSessionListener?
 I also tryid to make my custom session implement
 HttpSessionBindingListener and override valueUnbound
 but that makes no difference. Is there a example for this anywhere, that
 seems to be such a common use case?
 Best Regards
 Daniela


 2014-03-13 15:40 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

 Hi,

 Maybe it is a problem in your code ;-)

  pIn case of session expiration this method is called in a non-worker
 thread, i.e.
  * there are no thread locals exported for the Application, RequestCycle
 and Session.
  * The Session is the current instance. The Application can be found by
 using
  * {@link Application#get(String)}. There is no way to get a reference to
 a
 RequestCycle/p
  */
 public void onInvalidate()
 {
 }

 The javadoc clearly says that when this method is called by the web
 container due to session expiration there are no thread locals.
 The thread locals are available in #onInvalidate() only if the application
 code called Session#invalidate[Now]() explicitly.

 Martin Grigorov
 Wicket Training and Consulting


 On Thu, Mar 13, 2014 at 4:34 PM, Daniela L danigal...@gmail.com wrote:

  Hi Martin,
  if found the reason why the data is not freed in onInvalidate,
  the Spring/Hibernate update to the database issues a There is no
  application attached to current thread
  ContainerBackgroundProcessor[StandardEngine[Catalina]]. Is this a
 wicket
  or a tomcat issue?
  Best Regards
  Daniela
 
 
  2014-03-12 14:31 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
 
   On Wed, Mar 12, 2014 at 3:20 PM, Daniela L danigal...@gmail.com
 wrote:
  
Hi Martin,
thank you very much for your quick and brilliant answer :-)
Changing to AjaxCheckBox did the trick.
It seems to be very difficult to provide a secure way to invalidate
  user
data
cross browser compliant. I noticed that using a tablet with android
 or
   IOS
the
beforeunload is not triggered at all. Therefor I added a cleanup
 method
   to
the onInvalidate
of my custom session which should be triggered by the tomcats
session-timeout, but
it seems using mobile devices onInvalidate is not triggered?
   
  
   onInvalidate() is called by the server when the client hasn't
  touched/used
   its http session for session-timeout minutes.
   It shouldn't matter whether it is a desktop or mobile client.
  
  
Best Regards
Daniela
   
   
2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
   
 Hi,

 On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com
   wrote:

  Hi,
  I am using a close browser behavior to clean up user data if the
  user
  closes
  the browser window. I also use a CheckBox to toggle the
 visibility
  of
 some
  Textfields. Unfortunately the refresh through the click of the
   CheckBox
  triggers the close browser
  behavior. How can this be avoided?
  Here is what I did (with wicket 6.12.0):
 
 
  customerFirstName = new
RequiredTextFieldString(customer.firstName);
  customerFirstName.setOutputMarkupPlaceholderTag(true);
  closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
 @Override
  protected void respond(AjaxRequestTarget target) {
 
  AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
  }
 
  @Override
  public void renderHead(Component component,
   IHeaderResponse
  response) {
  super.renderHead(component, response);
  response.render(new
 
  OnDomReadyHeaderItem(window.onbeforeunload =
  function (e) {
  + if (!window.dontAsk) {
  + Wicket.Ajax.get({u:
  '+getCallbackUrl()+', async: false});
  + var message = 'my message.',
  + e = e || window.event; + if
  (e)
   {
  + e.returnValue = message; +
  }} +
  return message;
  +
  };));
  }
  };
  customerFirstName.add

Re: Close Browser Behavior

2014-03-14 Thread Daniela L
Hi Martin,
it is definitely a problem in my code :-))
But unfortunately I do not understand how to update the database at that
stage using
@SpringBean? Is that impossible? Do I have to do this outside Wicket using
a HttpSessionListener?
I also tryid to make my custom session implement HttpSessionBindingListener
and override valueUnbound
but that makes no difference. Is there a example for this anywhere, that
seems to be such a common use case?
Best Regards
Daniela


2014-03-13 15:40 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

 Hi,

 Maybe it is a problem in your code ;-)

  pIn case of session expiration this method is called in a non-worker
 thread, i.e.
  * there are no thread locals exported for the Application, RequestCycle
 and Session.
  * The Session is the current instance. The Application can be found by
 using
  * {@link Application#get(String)}. There is no way to get a reference to a
 RequestCycle/p
  */
 public void onInvalidate()
 {
 }

 The javadoc clearly says that when this method is called by the web
 container due to session expiration there are no thread locals.
 The thread locals are available in #onInvalidate() only if the application
 code called Session#invalidate[Now]() explicitly.

 Martin Grigorov
 Wicket Training and Consulting


 On Thu, Mar 13, 2014 at 4:34 PM, Daniela L danigal...@gmail.com wrote:

  Hi Martin,
  if found the reason why the data is not freed in onInvalidate,
  the Spring/Hibernate update to the database issues a There is no
  application attached to current thread
  ContainerBackgroundProcessor[StandardEngine[Catalina]]. Is this a wicket
  or a tomcat issue?
  Best Regards
  Daniela
 
 
  2014-03-12 14:31 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
 
   On Wed, Mar 12, 2014 at 3:20 PM, Daniela L danigal...@gmail.com
 wrote:
  
Hi Martin,
thank you very much for your quick and brilliant answer :-)
Changing to AjaxCheckBox did the trick.
It seems to be very difficult to provide a secure way to invalidate
  user
data
cross browser compliant. I noticed that using a tablet with android
 or
   IOS
the
beforeunload is not triggered at all. Therefor I added a cleanup
 method
   to
the onInvalidate
of my custom session which should be triggered by the tomcats
session-timeout, but
it seems using mobile devices onInvalidate is not triggered?
   
  
   onInvalidate() is called by the server when the client hasn't
  touched/used
   its http session for session-timeout minutes.
   It shouldn't matter whether it is a desktop or mobile client.
  
  
Best Regards
Daniela
   
   
2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
   
 Hi,

 On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com
   wrote:

  Hi,
  I am using a close browser behavior to clean up user data if the
  user
  closes
  the browser window. I also use a CheckBox to toggle the
 visibility
  of
 some
  Textfields. Unfortunately the refresh through the click of the
   CheckBox
  triggers the close browser
  behavior. How can this be avoided?
  Here is what I did (with wicket 6.12.0):
 
 
  customerFirstName = new
RequiredTextFieldString(customer.firstName);
  customerFirstName.setOutputMarkupPlaceholderTag(true);
  closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
 @Override
  protected void respond(AjaxRequestTarget target) {
 
  AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
  }
 
  @Override
  public void renderHead(Component component,
   IHeaderResponse
  response) {
  super.renderHead(component, response);
  response.render(new
 
  OnDomReadyHeaderItem(window.onbeforeunload =
  function (e) {
  + if (!window.dontAsk) {
  + Wicket.Ajax.get({u:
  '+getCallbackUrl()+', async: false});
  + var message = 'my message.',
  + e = e || window.event; + if
  (e)
   {
  + e.returnValue = message; +
  }} +
  return message;
  +
  };));
  }
  };
  customerFirstName.add(closeBrowserBehavior);
  form.add(customerFirstName);
 
  createAccountCB = new CheckBox(createAccountCB, new
  ModelBoolean(createAccount)){
  @Override
  protected void onSelectionChanged(Boolean
  newSelection) {
  super.onSelectionChanged(newSelection);
  createAccount = !createAccount;
  }
 
  @Override
  protected boolean
 wantOnSelectionChangedNotifications

Re: Close Browser Behavior

2014-03-13 Thread Daniela L
Hi Martin,
if found the reason why the data is not freed in onInvalidate,
the Spring/Hibernate update to the database issues a There is no
application attached to current thread
ContainerBackgroundProcessor[StandardEngine[Catalina]]. Is this a wicket
or a tomcat issue?
Best Regards
Daniela


2014-03-12 14:31 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

 On Wed, Mar 12, 2014 at 3:20 PM, Daniela L danigal...@gmail.com wrote:

  Hi Martin,
  thank you very much for your quick and brilliant answer :-)
  Changing to AjaxCheckBox did the trick.
  It seems to be very difficult to provide a secure way to invalidate user
  data
  cross browser compliant. I noticed that using a tablet with android or
 IOS
  the
  beforeunload is not triggered at all. Therefor I added a cleanup method
 to
  the onInvalidate
  of my custom session which should be triggered by the tomcats
  session-timeout, but
  it seems using mobile devices onInvalidate is not triggered?
 

 onInvalidate() is called by the server when the client hasn't touched/used
 its http session for session-timeout minutes.
 It shouldn't matter whether it is a desktop or mobile client.


  Best Regards
  Daniela
 
 
  2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
 
   Hi,
  
   On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com
 wrote:
  
Hi,
I am using a close browser behavior to clean up user data if the user
closes
the browser window. I also use a CheckBox to toggle the visibility of
   some
Textfields. Unfortunately the refresh through the click of the
 CheckBox
triggers the close browser
behavior. How can this be avoided?
Here is what I did (with wicket 6.12.0):
   
   
customerFirstName = new
  RequiredTextFieldString(customer.firstName);
customerFirstName.setOutputMarkupPlaceholderTag(true);
closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
   @Override
protected void respond(AjaxRequestTarget target) {
   
AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
}
   
@Override
public void renderHead(Component component,
 IHeaderResponse
response) {
super.renderHead(component, response);
response.render(new
OnDomReadyHeaderItem(window.onbeforeunload =
function (e) {
+ if (!window.dontAsk) {
+ Wicket.Ajax.get({u:
'+getCallbackUrl()+', async: false});
+ var message = 'my message.',
+ e = e || window.event; + if (e)
 {
+ e.returnValue = message; + }} +
return message;
+
};));
}
};
customerFirstName.add(closeBrowserBehavior);
form.add(customerFirstName);
   
createAccountCB = new CheckBox(createAccountCB, new
ModelBoolean(createAccount)){
@Override
protected void onSelectionChanged(Boolean newSelection) {
super.onSelectionChanged(newSelection);
createAccount = !createAccount;
}
   
@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
   
  
   This uses non-Ajax way to submit the new selection.
   As you noted this leads to 'beforeunload' event being fired.
  
   You will have to use AjaxCheckBox or AjaxFormComponentUpdatingBehavior
 to
   avoid the page reload.
  
  
}
};
form.add(createAccountCB);
   
emailRepeat = new TextFieldString(emailRepeat, new
PropertyModelString(appointCalendar, customer.eMailAdress)){
  @Override
protected void onConfigure(){
super.onConfigure();
setVisibilityAllowed(createAccount);
}
}
};
emailRepeat.setOutputMarkupPlaceholderTag(true);
form.add(emailRepeat):
   
Thanks a lot in advance!
Best Regards
Daniela
   
  
 



Re: Close Browser Behavior

2014-03-13 Thread Martin Grigorov
Hi,

Maybe it is a problem in your code ;-)

 pIn case of session expiration this method is called in a non-worker
thread, i.e.
 * there are no thread locals exported for the Application, RequestCycle
and Session.
 * The Session is the current instance. The Application can be found by
using
 * {@link Application#get(String)}. There is no way to get a reference to a
RequestCycle/p
 */
public void onInvalidate()
{
}

The javadoc clearly says that when this method is called by the web
container due to session expiration there are no thread locals.
The thread locals are available in #onInvalidate() only if the application
code called Session#invalidate[Now]() explicitly.

Martin Grigorov
Wicket Training and Consulting


On Thu, Mar 13, 2014 at 4:34 PM, Daniela L danigal...@gmail.com wrote:

 Hi Martin,
 if found the reason why the data is not freed in onInvalidate,
 the Spring/Hibernate update to the database issues a There is no
 application attached to current thread
 ContainerBackgroundProcessor[StandardEngine[Catalina]]. Is this a wicket
 or a tomcat issue?
 Best Regards
 Daniela


 2014-03-12 14:31 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

  On Wed, Mar 12, 2014 at 3:20 PM, Daniela L danigal...@gmail.com wrote:
 
   Hi Martin,
   thank you very much for your quick and brilliant answer :-)
   Changing to AjaxCheckBox did the trick.
   It seems to be very difficult to provide a secure way to invalidate
 user
   data
   cross browser compliant. I noticed that using a tablet with android or
  IOS
   the
   beforeunload is not triggered at all. Therefor I added a cleanup method
  to
   the onInvalidate
   of my custom session which should be triggered by the tomcats
   session-timeout, but
   it seems using mobile devices onInvalidate is not triggered?
  
 
  onInvalidate() is called by the server when the client hasn't
 touched/used
  its http session for session-timeout minutes.
  It shouldn't matter whether it is a desktop or mobile client.
 
 
   Best Regards
   Daniela
  
  
   2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:
  
Hi,
   
On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com
  wrote:
   
 Hi,
 I am using a close browser behavior to clean up user data if the
 user
 closes
 the browser window. I also use a CheckBox to toggle the visibility
 of
some
 Textfields. Unfortunately the refresh through the click of the
  CheckBox
 triggers the close browser
 behavior. How can this be avoided?
 Here is what I did (with wicket 6.12.0):


 customerFirstName = new
   RequiredTextFieldString(customer.firstName);
 customerFirstName.setOutputMarkupPlaceholderTag(true);
 closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
@Override
 protected void respond(AjaxRequestTarget target) {

 AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
 }

 @Override
 public void renderHead(Component component,
  IHeaderResponse
 response) {
 super.renderHead(component, response);
 response.render(new

 OnDomReadyHeaderItem(window.onbeforeunload =
 function (e) {
 + if (!window.dontAsk) {
 + Wicket.Ajax.get({u:
 '+getCallbackUrl()+', async: false});
 + var message = 'my message.',
 + e = e || window.event; + if
 (e)
  {
 + e.returnValue = message; +
 }} +
 return message;
 +
 };));
 }
 };
 customerFirstName.add(closeBrowserBehavior);
 form.add(customerFirstName);

 createAccountCB = new CheckBox(createAccountCB, new
 ModelBoolean(createAccount)){
 @Override
 protected void onSelectionChanged(Boolean
 newSelection) {
 super.onSelectionChanged(newSelection);
 createAccount = !createAccount;
 }

 @Override
 protected boolean wantOnSelectionChangedNotifications()
 {
 return true;

   
This uses non-Ajax way to submit the new selection.
As you noted this leads to 'beforeunload' event being fired.
   
You will have to use AjaxCheckBox or
 AjaxFormComponentUpdatingBehavior
  to
avoid the page reload.
   
   
 }
 };
 form.add(createAccountCB);

 emailRepeat = new TextFieldString(emailRepeat, new
 PropertyModelString(appointCalendar, customer.eMailAdress)){
   @Override
 protected void onConfigure(){
 super.onConfigure();
 setVisibilityAllowed(createAccount

Close Browser Behavior

2014-03-12 Thread Daniela L
Hi,
I am using a close browser behavior to clean up user data if the user closes
the browser window. I also use a CheckBox to toggle the visibility of some
Textfields. Unfortunately the refresh through the click of the CheckBox
triggers the close browser
behavior. How can this be avoided?
Here is what I did (with wicket 6.12.0):


customerFirstName = new RequiredTextFieldString(customer.firstName);
customerFirstName.setOutputMarkupPlaceholderTag(true);
closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
   @Override
protected void respond(AjaxRequestTarget target) {

AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
}

@Override
public void renderHead(Component component, IHeaderResponse
response) {
super.renderHead(component, response);
response.render(new
OnDomReadyHeaderItem(window.onbeforeunload =
function (e) {
+ if (!window.dontAsk) {
+ Wicket.Ajax.get({u:
'+getCallbackUrl()+', async: false});
+ var message = 'my message.',
+ e = e || window.event; + if (e) {
+ e.returnValue = message; + }} +
return message;
+
};));
}
};
customerFirstName.add(closeBrowserBehavior);
form.add(customerFirstName);

createAccountCB = new CheckBox(createAccountCB, new
ModelBoolean(createAccount)){
@Override
protected void onSelectionChanged(Boolean newSelection) {
super.onSelectionChanged(newSelection);
createAccount = !createAccount;
}

@Override
protected boolean wantOnSelectionChangedNotifications()
{
return true;
}
};
form.add(createAccountCB);

emailRepeat = new TextFieldString(emailRepeat, new
PropertyModelString(appointCalendar, customer.eMailAdress)){
  @Override
protected void onConfigure(){
super.onConfigure();
setVisibilityAllowed(createAccount);
}
}
};
emailRepeat.setOutputMarkupPlaceholderTag(true);
form.add(emailRepeat):

Thanks a lot in advance!
Best Regards
Daniela


Re: Close Browser Behavior

2014-03-12 Thread Martin Grigorov
Hi,

On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com wrote:

 Hi,
 I am using a close browser behavior to clean up user data if the user
 closes
 the browser window. I also use a CheckBox to toggle the visibility of some
 Textfields. Unfortunately the refresh through the click of the CheckBox
 triggers the close browser
 behavior. How can this be avoided?
 Here is what I did (with wicket 6.12.0):


 customerFirstName = new RequiredTextFieldString(customer.firstName);
 customerFirstName.setOutputMarkupPlaceholderTag(true);
 closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
@Override
 protected void respond(AjaxRequestTarget target) {

 AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
 }

 @Override
 public void renderHead(Component component, IHeaderResponse
 response) {
 super.renderHead(component, response);
 response.render(new
 OnDomReadyHeaderItem(window.onbeforeunload =
 function (e) {
 + if (!window.dontAsk) {
 + Wicket.Ajax.get({u:
 '+getCallbackUrl()+', async: false});
 + var message = 'my message.',
 + e = e || window.event; + if (e) {
 + e.returnValue = message; + }} +
 return message;
 +
 };));
 }
 };
 customerFirstName.add(closeBrowserBehavior);
 form.add(customerFirstName);

 createAccountCB = new CheckBox(createAccountCB, new
 ModelBoolean(createAccount)){
 @Override
 protected void onSelectionChanged(Boolean newSelection) {
 super.onSelectionChanged(newSelection);
 createAccount = !createAccount;
 }

 @Override
 protected boolean wantOnSelectionChangedNotifications()
 {
 return true;


This uses non-Ajax way to submit the new selection.
As you noted this leads to 'beforeunload' event being fired.

You will have to use AjaxCheckBox or AjaxFormComponentUpdatingBehavior to
avoid the page reload.


 }
 };
 form.add(createAccountCB);

 emailRepeat = new TextFieldString(emailRepeat, new
 PropertyModelString(appointCalendar, customer.eMailAdress)){
   @Override
 protected void onConfigure(){
 super.onConfigure();
 setVisibilityAllowed(createAccount);
 }
 }
 };
 emailRepeat.setOutputMarkupPlaceholderTag(true);
 form.add(emailRepeat):

 Thanks a lot in advance!
 Best Regards
 Daniela



Re: Close Browser Behavior

2014-03-12 Thread Daniela L
Hi Martin,
thank you very much for your quick and brilliant answer :-)
Changing to AjaxCheckBox did the trick.
It seems to be very difficult to provide a secure way to invalidate user
data
cross browser compliant. I noticed that using a tablet with android or IOS
the
beforeunload is not triggered at all. Therefor I added a cleanup method to
the onInvalidate
of my custom session which should be triggered by the tomcats
session-timeout, but
it seems using mobile devices onInvalidate is not triggered?
Best Regards
Daniela


2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

 Hi,

 On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com wrote:

  Hi,
  I am using a close browser behavior to clean up user data if the user
  closes
  the browser window. I also use a CheckBox to toggle the visibility of
 some
  Textfields. Unfortunately the refresh through the click of the CheckBox
  triggers the close browser
  behavior. How can this be avoided?
  Here is what I did (with wicket 6.12.0):
 
 
  customerFirstName = new RequiredTextFieldString(customer.firstName);
  customerFirstName.setOutputMarkupPlaceholderTag(true);
  closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
 @Override
  protected void respond(AjaxRequestTarget target) {
 
  AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
  }
 
  @Override
  public void renderHead(Component component, IHeaderResponse
  response) {
  super.renderHead(component, response);
  response.render(new
  OnDomReadyHeaderItem(window.onbeforeunload =
  function (e) {
  + if (!window.dontAsk) {
  + Wicket.Ajax.get({u:
  '+getCallbackUrl()+', async: false});
  + var message = 'my message.',
  + e = e || window.event; + if (e) {
  + e.returnValue = message; + }} +
  return message;
  +
  };));
  }
  };
  customerFirstName.add(closeBrowserBehavior);
  form.add(customerFirstName);
 
  createAccountCB = new CheckBox(createAccountCB, new
  ModelBoolean(createAccount)){
  @Override
  protected void onSelectionChanged(Boolean newSelection) {
  super.onSelectionChanged(newSelection);
  createAccount = !createAccount;
  }
 
  @Override
  protected boolean wantOnSelectionChangedNotifications()
  {
  return true;
 

 This uses non-Ajax way to submit the new selection.
 As you noted this leads to 'beforeunload' event being fired.

 You will have to use AjaxCheckBox or AjaxFormComponentUpdatingBehavior to
 avoid the page reload.


  }
  };
  form.add(createAccountCB);
 
  emailRepeat = new TextFieldString(emailRepeat, new
  PropertyModelString(appointCalendar, customer.eMailAdress)){
@Override
  protected void onConfigure(){
  super.onConfigure();
  setVisibilityAllowed(createAccount);
  }
  }
  };
  emailRepeat.setOutputMarkupPlaceholderTag(true);
  form.add(emailRepeat):
 
  Thanks a lot in advance!
  Best Regards
  Daniela
 



Re: Close Browser Behavior

2014-03-12 Thread Martin Grigorov
On Wed, Mar 12, 2014 at 3:20 PM, Daniela L danigal...@gmail.com wrote:

 Hi Martin,
 thank you very much for your quick and brilliant answer :-)
 Changing to AjaxCheckBox did the trick.
 It seems to be very difficult to provide a secure way to invalidate user
 data
 cross browser compliant. I noticed that using a tablet with android or IOS
 the
 beforeunload is not triggered at all. Therefor I added a cleanup method to
 the onInvalidate
 of my custom session which should be triggered by the tomcats
 session-timeout, but
 it seems using mobile devices onInvalidate is not triggered?


onInvalidate() is called by the server when the client hasn't touched/used
its http session for session-timeout minutes.
It shouldn't matter whether it is a desktop or mobile client.


 Best Regards
 Daniela


 2014-03-12 13:21 GMT+01:00 Martin Grigorov mgrigo...@apache.org:

  Hi,
 
  On Wed, Mar 12, 2014 at 1:15 PM, Daniela L danigal...@gmail.com wrote:
 
   Hi,
   I am using a close browser behavior to clean up user data if the user
   closes
   the browser window. I also use a CheckBox to toggle the visibility of
  some
   Textfields. Unfortunately the refresh through the click of the CheckBox
   triggers the close browser
   behavior. How can this be avoided?
   Here is what I did (with wicket 6.12.0):
  
  
   customerFirstName = new
 RequiredTextFieldString(customer.firstName);
   customerFirstName.setOutputMarkupPlaceholderTag(true);
   closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
  @Override
   protected void respond(AjaxRequestTarget target) {
  
   AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
   }
  
   @Override
   public void renderHead(Component component, IHeaderResponse
   response) {
   super.renderHead(component, response);
   response.render(new
   OnDomReadyHeaderItem(window.onbeforeunload =
   function (e) {
   + if (!window.dontAsk) {
   + Wicket.Ajax.get({u:
   '+getCallbackUrl()+', async: false});
   + var message = 'my message.',
   + e = e || window.event; + if (e) {
   + e.returnValue = message; + }} +
   return message;
   +
   };));
   }
   };
   customerFirstName.add(closeBrowserBehavior);
   form.add(customerFirstName);
  
   createAccountCB = new CheckBox(createAccountCB, new
   ModelBoolean(createAccount)){
   @Override
   protected void onSelectionChanged(Boolean newSelection) {
   super.onSelectionChanged(newSelection);
   createAccount = !createAccount;
   }
  
   @Override
   protected boolean wantOnSelectionChangedNotifications()
   {
   return true;
  
 
  This uses non-Ajax way to submit the new selection.
  As you noted this leads to 'beforeunload' event being fired.
 
  You will have to use AjaxCheckBox or AjaxFormComponentUpdatingBehavior to
  avoid the page reload.
 
 
   }
   };
   form.add(createAccountCB);
  
   emailRepeat = new TextFieldString(emailRepeat, new
   PropertyModelString(appointCalendar, customer.eMailAdress)){
 @Override
   protected void onConfigure(){
   super.onConfigure();
   setVisibilityAllowed(createAccount);
   }
   }
   };
   emailRepeat.setOutputMarkupPlaceholderTag(true);
   form.add(emailRepeat):
  
   Thanks a lot in advance!
   Best Regards
   Daniela