Eu precisei descobrir o Sistema Operacional do Client via browser em um modelo Strategy que estava desenvolvendo e fiz da seguinte forma:
No JSP:
<form action="SeuControle" method="post">
<script>
document.write("<input id="so" type="hidden" name="so" value=""+
navigator.userAgent +""/>");
</script>
<input type="submit" value="Efetuar Donwload"/>
</form>
No SeuControle Servlet .java
String so = request.getParameter("so");
No SeuControle Php
$so = $_POST["so"];
O problema é que a informação gerada possui conteúdo extra, desnecessário ao processo de identificação do SO. Para isso eu fiz um tratamento para saber se o texto contém o que eu quero ou não.
Ex: No SeuControle Servlet .java
if (so.contains("Linux")) {
// seu codigo aqui
} else if (so.contains("Windows")) {
// seu código aqui
}
Uma solução simples porém funcional, espero que ajude.