正确的基于浏览器用户代理的重定向方式?

时间:2011-10-14 12:39:24

标签: http servlets redirect servlet-filters user-agent

我正在构建一个基于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 个答案:

答案 0 :(得分:3)

想法3可能是一个坏主意,因为它很可能导致你必须对每个请求执行此检查,这是低效的(只是轻微,但可能会出现小的低效率)。

Idea's 1& 2也不是最好的方法,因为两者都会产生临时重定向(307)响应,而你可能想要的是永久重定向(301)。这是因为有问题的浏览器将始终相同 - FF和IE永远不会共享永久移动列表,因此即使两个浏览器都由同一客户端计算机使用,这也不会导致问题。出于效率的原因,你应该使用301 - 如果浏览器总是直接到达正确的位置,那么服务器的工作就不那么容易了。

总而言之,我认为2是最接近的,但你应该使用它:

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

请记住,用户代理字符串可能是欺骗性的,不能100%依赖。

这是我的个人意见,YMMV ......

答案 1 :(得分:1)

首先: 不要做服务器端浏览器SNIFING!

服务器端浏览器嗅探对于不同原因的来说是一个坏主意,但这只是其中的几个:

  1. 数百个不同的浏览器,而且这个数字一直在变化,所以检测它们都是一场你无法获胜的比赛
  2. 搜索引擎真的不喜欢它,当你给它们的东西不同于你给真正的浏览器时(并且它们会对它进行测试)
  3. 它无法可靠地告诉您用户浏览器的功能,因为他们可能欺骗了他们的用户代理字符串(由于各种原因),或者可能安装了其他东西,增加或减少了他们指示的浏览器本身的功能
  4. 更好的方法是使用渐进增强优雅降级

    话虽这么说,一个更可靠的选项是在浏览器中进行嗅探,然后相应地重定向客户端。 Modernizr会告诉您他们的浏览器具有哪些功能,从那里您可以决定为他们提供什么服务。