2011-10-14 53 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會告訴你他們的瀏覽器有什麼功能,並從那裏你可以決定爲他們提供服務。