We have a problem whereby a user is logged out after 30 minutes and JBoss
attempts to re-login, since we use a custom Principal which contains a session
id the session id is lost.
The reason a user logs out after 30 minutes is because in jboss-service.xml
DefaultCacheTimeout is set to 1800 seconds. What we would like is not to
specify a time but to allow a users timeout to be refreshed each time a secure
method is called, which is possible because org.jboss.util.TimedCachePolicy
contains a refersh() method, which is currently hard-coded to return false. So
what we have done is extend TimedCachePolicy and override refresh() to refresh
the timeout:
| public class TimedRefreshCachePolicy extends TimedCachePolicy implements
Serializable
| {
|
| /**
| * @see org.jboss.util.TimedCachePolicy#insert(java.lang.Object,
java.lang.Object)
| */
| @Override
| public void insert(Object key, Object value)
| {
| super.insert(key, new RefreshTimedEntry(getDefaultLifetime(), value));
| }
|
| /**
| * The default implementation of TimedEntry used to wrap non-TimedEntry
objects inserted into the
| * cache.
| */
| static class RefreshTimedEntry implements TimedEntry, Serializable
| {
|
| private long expirationTime = -1;
|
| private Object value = null;
|
| private long lifetime = -1;
|
| RefreshTimedEntry(final long lifetime, final Object value)
| {
| this.expirationTime = 1000 * lifetime;
| this.value = value;
| this.lifetime = lifetime;
| }
|
| public void init(long now)
| {
| expirationTime += now;
| }
|
| public boolean isCurrent(long now)
| {
| return expirationTime > now;
| }
|
| public boolean refresh()
| {
| // this is called to refresh the time since the last call to this
item in the
| // cache, return true to indicate that a refresh took place and
that the item
| // is still valid
| expirationTime = System.currentTimeMillis() + (1000 * lifetime);
| return true;
| }
|
| public void destroy()
| {
| }
|
| public Object getValue()
| {
| return value;
| }
| }
|
| }
According to chapter 8 we can configure our own cache policy:
anonymous wrote : This is done by appending the name of the security domain to
this name when looking up the CachePolicy for a domain
We have create an MBean to bind TimedRefreshCachePolicy to our security domain:
| public class PetStoreService extends ServiceMBeanSupport implements
PetStoreServiceMBean
| {
| ......
| new InitialContext().bind("java:/timedCacheFactory/petstore",
Class.forName("com.foo.TimedRefreshCachePolicy").newInstance());
|
| Object obj0 = new
InitialContext().lookup("java:/timedCacheFactory");
| Object obj1 = new
InitialContext().lookup("java:/timedCacheFactory/petstore");
| Object obj3 = new
InitialContext().lookup("java:/timedCacheFactory/sdmfhsjhdfcnb");
| ....
| }
|
The problem is TimedRefreshCachePolicy won't bind to
java:/timedCacheFactory/petstore in fact we can insert any text after
java:/timedCacheFactory and it will return a TimedCachePolicy, from the code
above:
obj0 returns some proxy
obj1 returns a TimedCachePolicy
obj2 returns a TimedCachePolicy
So how do I bind my TimedRefreshCachePolicy to
java:/timedCacheFactory/petstore? or have we got this wrong and implemented it
in the wrong way? We would preferably like a CachePolicy on a per domain basis,
without having to change any JBoss configuration.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3982617#3982617
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3982617
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user