It sounds like a context injection and dependency injection (CDI). You can define an interface, such as ClientInfo, that has the abstract methods getUsername and getIPAddress. Then, in your view layer, create a concrete implementation of this interface, say, JSFClientInfo, which uses FacesContext to capture the username and IP address. A business layer component can simply use @Inject ClientInfo.
Unfortunately, it seems to me that you will need to use a service locator, although due to the fact that CDI org.hibernate.envers.RevisionListener is not supported by CDI.
Ryan source share