Мне нужно переслать мой запрос (в jsp, но я не думаю, что это важно) из http.Filter если URI исходного запроса проходит некоторую проверку того, что мой фильтр запускается.
Я нашел эту страницу , которая столкнулась с подобной задачей
Тем не менее мне нужно вычислить следующее:
Как я могу получить ServletContext в Метод doFilter ()
(для вызова API переадресации) getServletContext ()
не распознается
Должен ли я вызывать 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 (){
getServletContext().getRequestDispatcher(
"MySpecific.jsp").forward(request,response);
}
}
chain.doFilter(request,response);
}
Как я могу получить ServletContext в методе doFilter ()?
httpServletRequest.getSession().getServletContext();
Должен ли я вызывать chain.doFilter () перед пересылкой, после пересылки или не вызывать вообще? Вдобавок мне нужно вызывать chain.doFilter (), если моя проверка прошла или только если она не удалась (потому что в этом случае я не буду продолжать пересылать свою страницу)?
Я бы сказал, что если вы переадресовали запрос, вы не должны вызывать chain.doFilter ()
- перенаправленный запрос будет отфильтрован в соответствии с его собственной конфигурацией фильтра. Однако, если ваша проверка не удалась, это зависит от семантики вашего веб-приложения - если исходная страница представляет собой своего рода общую ошибку / экран входа / приветствия, вы можете продолжить это, когда проверка не удалась. Трудно сказать, не зная больше контекста.
Чтобы получить ServletContext
, у вас есть 2 варианта:
Сохранить из FilterConfig
во время инициализации и вызвать FilterConfig.getServletContext ()
call HttpServletRequest.getSession (). getServletContext ()
Я не думаю, что вам обязательно нужен ServletContext
, чтобы получить RequestDispatcher
, поскольку вы могли бы просто позвонить HttpServletRequest.getRequestDispatcher ()
.
Что касается вызова FilterChain.doFilter ()
, если вы выполняете переадресацию, я бы подумал, что вы не будете звонить, поскольку после пересылки я предполагаю, что вы не хотите ничего из стандартное поведение.
Если вы не перенаправляете (вы не попадаете в блок if), я бы вызвал метод FilterChain.doFilter ()
, однако это предполагает, что на другом конце есть цель, которая должна быть вызван.