Правильный способ перенаправления на основе браузера user-agent? - PullRequest
1 голос
/ 14 октября 2011

Я создаю приложение на основе Spring MVC, в котором я хочу перенаправить пользователя на определенную часть сайта на основе его браузера.

Я использую Фильтр, примененный к /site/home.jsp, чтобы прочитать User-Agent и определить тип браузера.

HttpServletRequest req = (HttpServletRequest) request;
String uaString = req.getHeader("User-Agent");

Далее я хочу перенаправить пользователей, как показано ниже:

  • Firefox: перенаправить на /site/firefox/home.jsp
  • IE: перенаправить на /site/ie/home.jsp
  • Неизвестно: перенаправить в /site/UnsupportedBrowser.jsp

Моя путаница заключается в том, как правильно перенаправить пользователя из моего фильтра BrowserDetector?

1) Просто перенаправить пользователя?

resp.sendRedirect("/AppName/site/ie/home.jsp");

2) Использовать HTTP-перенаправление Temp?

resp.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
resp.setHeader("Location", "/AppName/site/ie/home.jsp");

3) Перенаправление на сервер?

RequestDispatcher request_Dispatcher=request.getRequestDispatcher("/ie/home.jsp");
request_Dispatcher.forward(request,response);

4) Любой другой правильный путь?

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Идея № 3, вероятно, является плохой идеей, так как она, скорее всего, приведет к тому, что вам придется выполнять эту проверку для каждого запроса, что неэффективно (только незначительно, но небольшие неэффективности могут возрасти).

Идеи с номерами 1 и 2 также не являются лучшим подходом, потому что оба приведут к ответу временного перенаправления (307), тогда как вы, вероятно, захотите, это постоянное перенаправление (301). Это связано с тем, что рассматриваемый браузер всегда будет одним и тем же - FF и IE никогда не будут делиться там списком постоянных перемещений, поэтому даже если оба браузера используются на одном и том же клиентском компьютере, это не вызовет проблем. Вы должны использовать 301 из соображений эффективности, опять же, если браузер всегда идет прямо в нужное место, ваш сервер выполняет меньше работы.

Подводя итог, я думаю, что идея 2 самая близкая, но вы должны использовать это вместо:

resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
resp.setHeader("Location", "/AppName/site/ie/home.jsp");

Имейте в виду, что строки User-Agent могут быть подделаны и на них нельзя полагаться на 100%.

Это мое личное мнение, YMMV ...

1 голос
/ 14 октября 2011

В первую очередь: НЕ ДЕЛАЙТЕ СЕРВЕР-БРАУЗЕР СНИФФИНГ!

Обнаружение браузера на стороне сервера - плохая идея для связки разных причин, но вот только некоторые из них:

  1. Существует сотни различных браузеров, и это число постоянно меняется, поэтому обнаружение их всех - это гонка, в которой вы не можете выиграть
  2. Поисковые системы на самом деле не нравится, когда вы даете им разные вещи, чем вы даете реальным браузерам (и они это проверяют)
  3. Он не дает достоверной информации о возможностях браузера пользователя, поскольку он может подделать строку своего пользовательского агента (по разным причинам) или может установить другие компоненты, которые увеличивают или уменьшают возможности, указанные в указанном браузере изначально

Гораздо лучший подход - использовать Прогрессивное улучшение или Изящная деградация .

При этом, один из вариантов, который работает более надежно, - это выполнить анализ в браузере, а затем перенаправить их на клиентскую сторону соответственно. Modernizr расскажет вам, какими возможностями обладает их браузер, и оттуда вы сможете решить, что им обслуживать.

...