To add to @BalusC suggestion of using an idle monitor:
An idle monitor set to have a slightly smaller value than the session timeout would work in most cases. But if the user is on the page, and is moving their cursor around, the session would eventually expire, but the idle monitor wouldn't trigger.
A workaround this is to have a PrimeFaces' poll that would keep the session alive along side the idle monitor; If the user is on the page and doing some actions, then their session would stay alive (either thanks to their actions if they make a request, or thanks to the poll). If not, then even when the poll re-extends the session automatically, the idle monitor would kick in due to inactivity (you can then hook the idle monitor to redirect to the page).
This, however, does indeed mean that the session would remain alive as long as the user is doing any sort of activity, as opposed to staying alive only as long as requests are being made (for example through commandButtons, ext...).