Перенаправление разрешения после истечения сессии не работает над представлением формы JSF, страница остается то же самое

Я использую JSF2. Я осуществил сервлет лиц обычая как так:

public class MyFacesServletWrapper extends MyFacesServlet {
   //...
}

где я делаю некоторые проверки разрешения и посылаю перенаправление, когда пользователь не вошел:

public void service(ServletRequest request, ServletResponse response) {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    if (...) {
        String loginURL = req.getContextPath() + "/LoginPage.faces";
        res.sendRedirect(loginURL);
    }
}

Это работает, когда пользователь пытается провести к другой странице. Однако это не работает, когда форма JSF представлена связью/кнопкой команды JSF. Линия sendRedirect() линия поражена и выполнена, никакое исключение не брошено, но пользователь остается в той же самой странице. В основном нет никакого визуального изменения вообще.

Почему это работает над навигацией страницы, но не над формой подчиняются?

8
nl ja de

2 ответы

Ваша конкретная проблема, скорее всего, вызывается, потому что ваша связь/кнопка команды JSF на самом деле отправляет ajax запрос, который в свою очередь ожидает специальный ответ XML. Если бы вы посылаете перенаправление как ответ на запрос ajax, то он просто отправил бы запрос ajax к тому URL. Это в свою очередь терпит неудачу без обратной связи, потому что URL перенаправления возвращает целую страницу HTML вместо специального ответа XML. Необходимо на самом деле возвращать специальный ответ XML, где JSF ajax двигатель приказан изменить ток window.location .

Но у вас есть на самом деле большие проблемы: использование неправильного инструмента для работы. Необходимо использовать a фильтр сервлета для работы, не отечественного сервлета и наверняка не той, которая вытесняет FacesServlet , кто ответственное за все работы JSF.

Предположение, что вы выполняете логин в запросе/представлении, рассмотрело JSF отступающий боб следующим образом (если вы используете организованную идентификацию контейнера, см. также 2-й пример Выполнение аутентификации пользователя на Яве EE/JSF, использующий j_security_check):

externalContext.getSessionMap().put("user", user);

Тогда этот пример начала фильтра должен сделать:

@WebFilter("/*")//Or @WebFilter(servletNames={"facesServlet"})
public class AuthorizationFilter implements Filter {

    private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        + "";

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        String loginURL = request.getContextPath() + "/login.xhtml";

        boolean loggedIn = (session != null) && (session.getAttribute("user") != null);
        boolean loginRequest = request.getRequestURI().equals(loginURL);
        boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");
        boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));

        if (loggedIn || loginRequest || resourceRequest)) {
            if (!resourceRequest) {//Prevent browser from caching restricted resources. See also https://stackoverflow.com/q/4194207/157882
                response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");//HTTP 1.1.
                response.setHeader("Pragma", "no-cache");//HTTP 1.0.
                response.setDateHeader("Expires", 0);//Proxies.
            }

            chain.doFilter(request, response);//So, just continue request.
        }
        else if (ajaxRequest) {
            response.setContentType("text/xml");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().printf(AJAX_REDIRECT_XML, loginURL);//So, return special xml response instructing JSF ajax to send a redirect.
        }
        else {
            response.sendRedirect(loginURL);//So, just perform standard synchronous redirect.
        }
    }

   //...
}

См. также:

17
добавлено
Хорошо, I' ve осуществил его с помощью Фильтр . Однако я все еще don' t еще понимают если ("partial/ ajax"...) часть. Вы могли объяснить более подробно или обеспечить некоторые связи?
добавлено автор Danijel, источник
Если эта линия request.getRequestURI() .startsWith (request.getContextPath() + ResourceHandler. RESOURCE_IDENTIFIER); ручка CSS файлы? Швы как он doesn' t.
добавлено автор Danijel, источник
Они не.:-), перепишет, большое спасибо.
добавлено автор Danijel, источник
JSF ajax запрос требует специального ответа XML. Ответ HTTP 302 не интерпретируется как перенаправление окна JSF ajax двигатель, но как перенаправление к новому ответу XML. Однако, если то перенаправление на самом деле возвращает страницу HTML, оно не терпит неудачу с "никакой обратной связью". Необходимо возвратить специальный ответ XML, который говорит JSF ajax двигатель, чтобы послать перенаправление на данном URL. Можно признать JSF ajax запросы, проверив упомянутую стоимость заголовка ответа. В стороне JSF это обычно находится под "покрытиями", обработанными ExternalContext#redirect() . Но вне контекста JSF, необходимо иметь дело с ним вручную.
добавлено автор BalusC, источник
Только если they' на ре ссылаются с помощью .
добавлено автор BalusC, источник

FacesContext.getCurrentInstance() .getExternalContext() .redirect ("newpage.xhtml"); попробуйте это.... вместо res.sendredirect (cpath).

0
добавлено
Спасибо. Это не работает: FacesContext.getCurrentInstance() прибыль пустой указатель . Что сделать?
добавлено автор Danijel, источник
Конечно, это doesn' t работа. FacesContext только доступен в FacesServlet , не отечественный сервлет.
добавлено автор BalusC, источник
То, как эта несправедливость отвечала, получило 2 upvotes?
добавлено автор BalusC, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async