Я предлагаю две возможности.
1. Использовать перехватчик обработчика. Вы правы. Я считаю, что это лучший вариант. Определите тип браузера перед контроллером, а затем используйте информацию браузера, чтобы отобразить нужную страницу.
Посмотрите на этот пример псевдокоде, вам потребуется библиотека user-agent-utils:
public class BrowserInfo {
private String name;
private int version;
public BrowserInfo(String name, int version) {
this.name = name;
this.version = version;
}
// getter, setter...
}
/**
* Detect browser type and make it available in your controller
*/
public class BrowserResolverHandlerInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//
// FROM: http://stackoverflow.com/a/13229552/1614378
//
String userAgent = request.getHeader("user-agent");
UserAgent ua = UserAgent.parseUserAgentString(userAgent);
Version browserVersion = ua.getBrowserVersion();
String browserName = ua.getBrowser().toString();
int majVersion = Integer.parseInt(browserVersion.getMajorVersion());
BrowserInfo browser = new BrowserInfo(browserName, majVersion);
request.setAttribute("browserInfo", browser);
return true;
}
}
/**
* HandlerMethodArgumentResolver. so you can use BrowserInfo as argument in you controller methods.
*/
public class BrowserInfoResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(BrowserInfo.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return (BrowserInfo) webRequest.getAttribute("browserInfo", RequestAttributes.SCOPE_REQUEST);
}
}
Теперь вы можете использовать его в контроллере:
@Controller
@RequestMapping(value = "/")
public class RootController extends AbstractWebController {
@RequestMapping(method = RequestMethod.GET)
public String home(BrowserInfo browser, Locale locale, Model model, HttpServletRequest request) {
if("ie".equals(browser.getName()) && browser.getVersion() < 7){
return "redirect:error"; // error.jsp or browser_not_supported.jsp...
}
return "home"; // home.jsp
}
}
2. детектировать (IE) версия браузера в вашем jsp:About conditional comments
Пример:
<!--[if gte IE 8]>
<style>
[styles for IE 8]
</style>
<![endif]-->
<!--[if lt IE 8]>
<style>
[styles for IE 7: hide all elements, show message label etc...]
</style>
<script>
alert("Pls update your browser. now!");
</script>
<![endif]-->
EDIT:
(3) вы можете также отправить перенаправление внутри перехватчик. Но я лично не нравится. Потому что вы разделите свою «логику страницы» между Interceptor
и Controller
. В любом случае, я верю, что перенаправление перехватчиком будет быстрее, чем перенаправление контроллером.
примеры, которые я нашел в Интернете, добавляли переадресацию в перехватчик (перенаправление на/ошибка, а затем другой контроллер обрабатывает его) вместо передачи флага и обработки его в основном контроллере. Что ты думаешь по этому поводу? – sublime
@sublime я обновил свой ответ. но это только мое личное мнение. – dit