我正在构建一个基于Spring MVC的应用程序,我想根据浏览器将用户重定向到站点的特定部分。
我正在使用应用于/site/home.jsp的过滤器来读取User-Agent以确定浏览器类型。
HttpServletRequest req = (HttpServletRequest) request;
String uaString = req.getHeader("User-Agent");
此外,我想重定向用户,如下所示:
我的困惑是从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)还有其他正确方法吗?
答案 0 :(得分: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!
服务器端浏览器嗅探对于不同原因的束来说是一个坏主意,但这只是其中的几个:
更好的方法是使用渐进增强或优雅降级。
话虽这么说,一个更可靠的选项是在浏览器中进行嗅探,然后相应地重定向客户端。 Modernizr会告诉您他们的浏览器具有哪些功能,从那里您可以决定为他们提供什么服务。