Как перенаправить фильтр сервлета?

Я пытаюсь найти способ перенаправить мой запрос с фильтра на страницу входа, но я не знаю, как перенаправить с сервлета. Я искал, но нашел метод sendRedirect(). Я не могу найти этот метод в моем объекте ответа в фильтре. В чем причина? Как я могу это решить?


person wasimbhalli    schedule 15.03.2011    source источник


Ответы (6)


В фильтре ответ ServletResponse, а не HttpServletResponse. Следовательно, сделайте приведение к HttpServletResponse.

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login.jsp");

При использовании контекстного пути:

httpResponse.sendRedirect(req.getContextPath() + "/login.jsp");

Также не забудьте вызвать return; в конце.

person Dead Programmer    schedule 15.03.2011
comment
Есть ли способ разрешить путь jsp с помощью viewResolver внутри фильтра? - person FelipeKunzler; 04.03.2016
comment
это работает только в том случае, если запрос исходит из браузера. Это внешнее перенаправление. - person Vahe Gharibyan; 22.07.2017
comment
если используется sendredirect, параметр разговораContext потерян, как я могу перенаправить с параметром разговораContext? - person luis alberto juarez; 24.02.2021

Я пытаюсь найти способ перенаправить мой запрос с фильтра на страницу входа.

Нет

Вы просто вызываете

chain.doFilter(request, response);

от фильтра, и нормальный поток пойдет вперед.

Я не знаю, как перенаправить с сервлета

Ты можешь использовать

response.sendRedirect(url);

перенаправить с сервлета

person jmj    schedule 15.03.2011
comment
Однако это полезно, если вы хотите прервать запрос, потому что пользователь не вошел в систему. - person BalusC; 15.03.2011
comment
response имеет тип ServletResponse и должен быть приведен к HttpServletResponse. Пример: HttpServletResponse resp = (HttpServletResponse) response; resp.sendRedirect("templateName || pathName"); - person Andrius; 15.05.2017
comment
Почему вы сказали ему не перенаправлять на страницу аутентификации из фильтра? Пожалуйста, дополните? - person Joe C; 10.04.2019
comment
Это вообще не решает вопрос. - person Vsevolod Golovanov; 12.01.2021

Если вы также хотите сохранить хэш и получить параметр, вы можете сделать что-то вроде этого (заполнить redirectMap при инициализации фильтра):

String uri = request.getRequestURI();

String[] uriParts = uri.split("[#?]");
String path = uriParts[0];
String rest = uri.substring(uriParts[0].length());

if(redirectMap.containsKey(path)) {
    response.sendRedirect(redirectMap.get(path) + rest);
} else {
    chain.doFilter(request, response);
}
person user1079877    schedule 19.09.2013
comment
Насколько мне известно, браузер ничего не отправляет после '#' в URI на серверную часть. Итак, как это должно работать? - person Raj; 23.10.2019
comment
Ты прав. Но я помню, что получил ошибку из-за хеша на сервере. Может быть, потому что я использовал curl или какой-то другой клиент. В любом случае, это дешево, чтобы быть уверенным на 100%. - person user1079877; 24.10.2019

Попробуйте и проверьте, что ваш ServletResponse response является instanceof HttpServletResponse следующим образом:

if (response instanceof HttpServletResponse) {
    response.sendRedirect(....);
}
person Buhake Sindi    schedule 15.03.2011
comment
нет необходимости, так как метод фильтрации public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - person To Kra; 11.06.2015
comment
@ToKra Это не сигнатура метода и приводит к ошибке компилятора. - person Kevin Workman; 07.03.2018

Ваш объект ответа объявлен как ServletResponse. Чтобы использовать метод sendRedirect(), вы должны привести его к HttpServletResponse. Это расширенный интерфейс, который добавляет методы, связанные с протоколом HTTP.

person jan.vdbergh    schedule 15.03.2011
comment
В методе filter уже есть этот public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - person To Kra; 11.06.2015

почему вы используете объект ответа. это объект ServletResponse, он не предоставляет метод sendRedirect(). вместо этого используйте объект запроса ServletRequest для пересылки запроса.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        request.getRequestDispatcher("login.html").forward(request,response);
        return;
        
    }

см. javadoc

person deepak lodhi    schedule 27.05.2021