Merge remote-tracking branch 'origin/jetty-8'

Conflicts:
	jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionIdManager.java
This commit is contained in:
Greg Wilkins 2013-03-07 09:09:23 +11:00
commit e283d72f25
1 changed files with 49 additions and 12 deletions

View File

@ -37,6 +37,7 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme
protected Random _random; protected Random _random;
protected boolean _weakRandom; protected boolean _weakRandom;
protected String _workerName; protected String _workerName;
protected long _reseed=100000L;
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
public AbstractSessionIdManager() public AbstractSessionIdManager()
@ -89,6 +90,24 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme
_weakRandom=false; _weakRandom=false;
} }
/* ------------------------------------------------------------ */
/**
* @return the reseed probability
*/
public long getReseed()
{
return _reseed;
}
/* ------------------------------------------------------------ */
/** Set the reseed probability.
* @param reseed If non zero then when a random long modulo the reseed value == 1, the {@link SecureRandom} will be reseeded.
*/
public void setReseed(long reseed)
{
_reseed = reseed;
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
* Create a new session id if necessary. * Create a new session id if necessary.
@ -134,19 +153,37 @@ public abstract class AbstractSessionIdManager extends AbstractLifeCycle impleme
long r0=_weakRandom long r0=_weakRandom
?(hashCode()^Runtime.getRuntime().freeMemory()^_random.nextInt()^((seedTerm)<<32)) ?(hashCode()^Runtime.getRuntime().freeMemory()^_random.nextInt()^((seedTerm)<<32))
:_random.nextLong(); :_random.nextLong();
if (r0<0) if (r0<0)
r0=-r0; r0=-r0;
long r1=_weakRandom
?(hashCode()^Runtime.getRuntime().freeMemory()^_random.nextInt()^((seedTerm)<<32)) // random chance to reseed
:_random.nextLong(); if (_reseed>0 && (r0%_reseed)== 1L)
if (r1<0) {
r1=-r1; LOG.debug("Reseeding {}",this);
id=Long.toString(r0,36)+Long.toString(r1,36); if (_random instanceof SecureRandom)
{
SecureRandom secure = (SecureRandom)_random;
secure.setSeed(secure.generateSeed(8));
}
else
{
_random.setSeed(_random.nextLong()^System.currentTimeMillis()^seedTerm^Runtime.getRuntime().freeMemory());
}
}
long r1=_weakRandom
?(hashCode()^Runtime.getRuntime().freeMemory()^_random.nextInt()^((seedTerm)<<32))
:_random.nextLong();
if (r1<0)
r1=-r1;
id=Long.toString(r0,36)+Long.toString(r1,36);
//add in the id of the node to ensure unique id across cluster //add in the id of the node to ensure unique id across cluster
//NOTE this is different to the node suffix which denotes which node the request was received on //NOTE this is different to the node suffix which denotes which node the request was received on
if (_workerName!=null) if (_workerName!=null)
id=_workerName + id; id=_workerName + id;
} }
return id; return id;
} }