Mostly Harmless

Legacy:Sessions

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

Here's an example on how to implement sessions into your application.

Sessions are usefull to keep a record of variables per user/session. Sessions are often used in web pages to keep track of temporary user settings when they visit your site.

Sessions class

This class manages all sessions

class Sessions extends Object;
 
var array<Session> sessions;
 
// create a new session
function Session createSession()
{
  sessions.length = sessions.length+1;
  sessions[sessions.length-1] = new(None) class'Session';
  sessions[sessions.length-1].Hash = createSessionHash();
  return sessions[sessions.length-1];
}
 
// get a session by it's hash
function Session getSession(string hash, optional bool bCreateNew)
{
  local int i;
  for (i = 0; i < sessions.length; i++)
  {
    if (sessions[i].Hash == hash) return sessions[i];
  }
  if (bCreateNew) return createSession();
  return none;
}
 
// destroy an existing session
function bool destroySession(Session session)
{
  local int i;
  for (i = 0; i < sessions.length; i++)
  {
    if (sessions[i].Hash == session.Hash) 
    {
      sessions.Remove(i, 1);
      return true;
    }
  }
  return false;
}
 
// create a unique session hash
function private string createSessionHash()
{
  local int i;
  local string temphash;
 
  do {
    temphash = Right("00000"$string(Rand(65536)), 5)$Right("00000"$string(Rand(65536)), 5);
    for (i = 0; i < sessions.length; i++)
    {
      if (sessions[i].hash == temphash) break;
    }
  } until (i == sessions.length);
  return temphash;
}

Session class

This class will contain the data for a single session.

class Session extends Object;
 
struct export KeyValuePair
{
    var string Key;
    var string Value;
};
 
// contains the unique identifier
var string hash;
// contains the data for this session
var array<KeyValuePair> Data;
 
// get the value of a var name, return sdefault if not found
// bFound is 1 when the value exists, 0 otherwise
function string getValue(string name, optional string sdefault, optional out int bFound)
{
  local int i;
  bFound = true;
  for (i = 0; i<data.length; i++)
  {
    if (data[i].key == name) return data[i].value;
  }
  bFound = false;
  return sdefault;
}
 
// Set the value of a var name, if bAddIfNotExists it will be added when it doesn't exist
// oldValue will have the previous value
function bool setValue(string name, string value, bool bAddIfNotExists, optional out string oldValue)
{
  local int i;
  for (i = 0; i<data.length; i++)
  {
    if (data[i].key == name) 
    {
      oldValue = data[i].value;
      data[i].value = value;
      return true;
    }
  }
  if (bAddIfNotExists)
  {
    data.length = data.length+1;
    data[data.length-1].Key = name;
    data[data.length-1].Value = value;
    return true;
  }
  return false;
}
 
// Remove a value from the session
function bool removeValue(string name, optional out string oldValue)
{
  local int i;
  for (i = 0; i<data.length; i++)
  {
    if (data[i].key == name) 
    {
      oldValue = data[i].value;
      data.remove(i, 1);
      return true;
    }
  }
  return false;
}

Example usage

Let's say you have made a custom QueryHandler and you need to keep track of some changes before submitting them.

class MyQueryHandler extends xWebQueryHandler;
 
var Sessions sessions;
 
function bool Init()
{
  Super.Init();
  sessions = new(None) class'Sessions';
  return true;
}
 
function bool Query(WebRequest Request, WebResponse Response)
{
  local session CurSession;
  local int tempvalue;
 
  CurSession = sessions.getSession(Request.GetVariable("sessionID"), true);
  Response.Subst("sessionID", CurSession.hash); // replace %sessionID% with the session hash
 
  tempvalue = int(CurSession.getValue("pageVisits", 0));
  tempValue++;
  tempvalue = CurSession.setValue("pageVisits", string(tempvalue), true);
  Response.Subst("pageVisits", string(tempvalue));
  // process the query
}

Now you will only have to pass the sessionID to remember the variables

Example HTML file:

 <html>
 <body>
 You have visited this page %pageVisits% time(s)
 <p> 
 <a href="?sessionID=%sessionID%">include the session ID in a link like this</a>
 <p>
 or this to include it in a form
 <form>
 <input type="hidden" name="sessionID" value="%sessionID%">
 <input type="submit">
 </form>
 </body>
 </html>