2011-10-14 43 views
0

我正在构建一个基于Spring MVC的应用程序,我想根据浏览器将用户的网站重定向到特定部分。正确的方式基于浏览器用户代理重定向?

我正在使用应用于/site/home.jsp的过滤器来读取用户代理以确定浏览器类型。

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

而且我想下面将用户重定向:

  • 火狐:重定向到/site/firefox/home.jsp
  • IE:重定向到/site/ie/home.jsp
  • 未知:重定向到/site/UnsupportedBrowser.jsp

我的困惑是什么是用户从我BrowserDetecto重定向的正确方法r过滤器?

1)只需重定向用户?

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

2)使用HTTP临时重定向?

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)其他正确的方法?

+0

你试图通过嗅探浏览器服务器端来实现什么? – cdeszaq

+0

我需要执行一些特定于浏览器的业务逻辑...... Firefox用户通过不同的特定流程和IE浏览器......相信我......这是一个用例。 –

+0

但是......实际上没有办法告诉浏览器使用什么来查看您的网站...... UA嗅探只是一个(略)受教育的猜测。 – cdeszaq

回答

3

想法3可能是一个坏主意,因为它很可能会导致您不得不为每个请求执行此检查,这是低效的(只是略微,但小的低效率可以上升)。

想法编号1 & 2也不是最好的方法,因为两者都会导致临时重定向(307)响应,这可能是您想要的永久重定向(301)。这是因为所讨论的浏览器总是相同的--FF和IE永远不会共享永久移动列表,所以即使两台浏览器都被同一台客户机使用,这也不会引起问题。出于效率的原因,您应该使用301 - 如果浏览器总是直接进入正确的位置,那么服务器的工作量就会减少。

综上所述,我觉得想法2是最接近的,但你应该这样,而不是使用:

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

请记住,用户代理字符串是可以被欺骗并不能100%依靠。

这是我个人的看法,因人而异......

1

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

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

  1. 数百个不同的浏览器和数量的变化所以检测他们都是一场你不能赢的比赛
  2. 搜索引擎真的当你给他们不同的东西比你给真正的浏览器(他们测试它)
  3. 它不能可靠地告诉你用户浏览器的功能,因为它们可能欺骗了他们的用户代理字符串(出于各种原因),或者可能安装了其他东西来增加或减少它们指示的浏览器本身具有的功能

更好的方法是使用渐进增强优美退化

也就是说,一个更可靠的选项是在浏览器中执行嗅探,然后相应地将它们重定向到客户端。 Modernizr会告诉你他们的浏览器有什么功能,并从那里你可以决定为他们提供服务。