Olá Christiano,
Saudações Sul-Matogrossenses para você. Finalmente achei alguem da minha terra aqui no Forum.
Realmente, a solução mais fácil para solucionar o seu problema é convencer o seu cliente de que isso é a coisa mais natural em uma aplicação cliente/servidor com sessão.
Bom fora isso, você pode usar uma idéia de subsessão.
Deixa eu explicar melhor:
1 - Coloque tudo que você precisar manter na sessão em uma Classe, por exemplo MinhaSessão.
2 - Crie um HashMap de MinhaSessão e coloque-o na sessão real de seu ServidorWeb.
3 - Faça todas as suas requisições, originadas de todas as sua páginas exceto da Home, passando como parâmetro um SubSessionId que você pode criar como quiser.
4 - Na Home você não passa esse Id, e durante o processamento do request da Home, você cria esse Id, cria uma instancia do MinhaSessão, usa o id para incluir o MinhaSessão no HashMap, e devolva o id para suas páginas subsequentes sempre reenviá-lo nas próximas requisições.
5 - No processamento das outras páginas você usa o Id passado pelas páginas para obter o MinhaSessão do HashMap.
Pegou a idéia?
Dessa forma, se o usuário abrir uma nova aba e tentar entrar no sistema ele vai receber um novo Id com uma nova Sessão.
Só que se o usuário clicar em um de seus links com o botão direito e mandar abrir em uma nova aba ele irá utilizar o mesmo id e assim vai “roubar” a sessão, pois as duas abas vão usar o mesmo id.
Espero ter ajudado.