При реализации пользовательских механизмов авторизации в приложениях JSF крайне важно понимать разницу между навигацией по страницам и отправкой форм . Хотя перенаправления работают без проблем при навигации по страницам, они могут сталкиваться с проблемами во время отправки форм.
Основная причина этой проблемы заключается в том, что отправка форм JSF вызывает асинхронные запросы. Когда перенаправление отправляется как ответ на асинхронный запрос, механизм JSF AJAX ожидает определенного ответа XML. Однако отправка обычной HTML-страницы нарушает это ожидание, в результате чего пользователь остается на той же странице.
Использование специального сервлета для проверки авторизации приводит к дополнительным сложностям. и потенциальные проблемы. Вместо этого рекомендуется использовать фильтр сервлетов, специально разработанный для этой цели. Фильтры предлагают более надежные и эффективные средства перехвата входящих запросов.
Ниже приведен пример фильтра сервлета, который эффективно обрабатывает проверки авторизации:
@WebFilter("/*") public class AuthorizationFilter implements Filter { private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "<partial-response><redirect url=\"%s\"></redirect></partial-response>"; @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) { // Continue request. chain.doFilter(request, response); } else if (ajaxRequest) { // Send special XML response to instruct JSF AJAX to redirect. response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); } else { // Perform стандартный синхронный редирект. response.sendRedirect(loginURL); } } }
Для получения дополнительной информации по этой теме обратитесь к следующим ресурсам:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3