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.