Запрос вперед с фильтра
Мне нужно отправить мой запрос (в jsp, но я не думаю, что это имеет значение) из http.Filter
если URI исходного запроса проходит некоторую проверку, что мой фильтр работает.
Я нашел эту страницу которая столкнулась с подобной задачей
Тем не менее мне нужно сделать следующее:
-
Как я могу получить ServletContext в методе doFilter()
(для вызова API переадресации вызовов) getServletContext()
не вызывается
-
Должен ли я иметь call chain.doFilter()
перед переходом, после переадресации или вообще нет?
Кроме того, мне нужно вызвать chain.doFilter()
, если моя проверка прошла или только если она терпит неудачу (потому что в этом случае я не буду продолжать пересылать мою страницу)?
Этот вопрос действительно продолжит эту тему,
чтобы быть более очевидным, код может быть примерно таким:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = ((HttpServletRequest)request);
String requestURI = httpServletRequest.getRequestURI();
String contextPath = httpServletRequest.getContextPath();
if (<this is my implementation of the validation of this filter>){
getServletContext().getRequestDispatcher(
"MySpecific.jsp").forward(request,response);
}
}
chain.doFilter(request,response);
}
Ответы
Ответ 1
Как я могу получить ServletContext в методе doFilter()?
httpServletRequest.getSession().getServletContext();
Нужно ли мне называть chain.doFilter() перед переходом, после переадресации или вообще нет? Кроме того, мне нужно вызвать chain.doFilter(), если моя проверка прошла или только если она терпит неудачу (потому что в этом случае я не буду продолжать пересылать мою страницу)?
Я бы сказал, что если вы отправили запрос, вы не должны называть chain.doFilter()
- перенаправленный запрос будет фильтроваться в соответствии с его собственной конфигурацией фильтра. Если ваша проверка не удалась, это зависит от того, какова семантика вашего веб-приложения - если исходная страница представляет собой какой-то общий экран ошибки/входа/приветствия, вы можете продолжить это, когда сбой проверки. Трудно сказать, не зная больше контекста.
Ответ 2
Чтобы получить ServletContext
, у вас есть 2 варианта:
Я не думаю, что вам понадобится ServletContext
, чтобы получить RequestDispatcher
, как вы могли бы просто позвонить HttpServletRequest.getRequestDispatcher()
.
В отношении вызова FilterChain.doFilter()
, если вы переадресовываете, я бы подумал, что вы не сделаете вызов, как только вы перейдете, я предполагаю, что вы не хотите, чтобы какое-либо стандартное поведение имело место.
Если вы не переходите (вы не попадаете в ваш блок if), я бы назвал метод FilterChain.doFilter()
, однако предполагается, что на другом конце есть цель.