【问题标题】:Correct way to Redirect based on browser user-agent?基于浏览器用户代理重定向的正确方法?
【发布时间】:2011-12-07 17:42:45
【问题描述】:

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

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

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 临时重定向?

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

【问题讨论】:

  • 你想通过嗅探浏览器服务器端来达到什么目的?
  • 我需要执行一些特定于浏览器的业务逻辑...Firefox 用户通过特定流程和 IE 通过不同...相信我...这是一个用例。
  • 但是...没有办法实际上知道正在使用什么浏览器来查看您的网站...UA 嗅探充其量只是一个(稍微)有根据的猜测。
  • 我同意...但是由于这将是一个内部站点... UA 欺骗不是问题...

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


【解决方案1】:

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

Idea 的数字 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...

【讨论】:

    【解决方案2】:

    首先:不要进行服务器端浏览器嗅探!

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

    1. 数百种不同的浏览器,而且这个数字一直在变化,所以检测它们是一场你无法获胜的竞赛​​li>
    2. 搜索引擎真的不喜欢你给他们的东西与你给真正的浏览器不同的东西(他们确实测试过)
    3. 它不能可靠地告诉您用户浏览器的功能,因为他们可能已经欺骗了他们的用户代理字符串(出于各种原因),或者可能安装了其他东西来增加或减少他们指定的浏览器本身具有的功能

    更好的方法是使用渐进增强优雅降级

    话虽如此,一种更可靠的选择是在浏览器中进行嗅探,然后相应地将它们重定向到客户端。 Modernizr 会告诉你他们的浏览器有哪些功能,然后你可以决定为他们提供什么服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2016-03-14
      • 2011-11-16
      • 1970-01-01
      • 2022-01-25
      • 2011-10-06
      相关资源
      最近更新 更多