>Java >java지도 시간 >사용자 정의 FacesServlet을 사용할 때 JSF 양식 제출 시 인증 리디렉션이 실패하는 이유는 무엇입니까?

사용자 정의 FacesServlet을 사용할 때 JSF 양식 제출 시 인증 리디렉션이 실패하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-03 01:51:29266검색

Why does Authorization Redirect Fail on JSF Form Submissions When Using a Custom FacesServlet?

JSF 양식 제출 시 세션 만료 시 권한 리디렉션

문제:

JSF에서 애플리케이션에서는 인증 확인을 수행하고 로그인하지 않은 경우 사용자를 로그인 페이지로 리디렉션하기 위해 사용자 정의 FacesServlet이 구현되었습니다. 이는 페이지 탐색 중에 예상대로 작동하지만 JSF 양식이 제출되면 리디렉션이 실패하고 사용자는 동일한 상태로 유지됩니다.

원인:

JSF 명령 링크/버튼이 XML 응답을 기대하는 Ajax 요청을 트리거하기 때문에 문제가 발생합니다. 그러나 sendRedirect() 메소드는 Ajax 엔진이 해석할 수 없는 일반 HTML 페이지를 보냅니다. 결과적으로 리디렉션이 수행되지 않고 페이지가 변경되지 않은 상태로 유지됩니다.

해결책:

1. 서블릿 필터 사용:

사용자 정의 서블릿을 사용하는 대신 인증 확인을 위해 서블릿 필터를 사용해야 합니다. 이는 작업에 더 적합하므로 권장되는 접근 방식입니다.

2. Ajax 요청을 다르게 처리:

필터에서 Ajax 요청을 별도로 처리합니다. 리디렉션을 보내는 대신 JSF Ajax 엔진에 리디렉션을 수행하도록 지시하는 특수 XML 응답을 보내세요.

필터 예시:

<code class="java">import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AuthorizationFilter implements Filter {

    private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<partial-response><redirect url=\"%s\"></redirect></partial-response>";

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        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 ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));

        if (loggedIn || ajaxRequest) {
            chain.doFilter(request, response);
        } else if (ajaxRequest) {
            response.setContentType("text/xml");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().printf(AJAX_REDIRECT_XML, loginURL);
        } else {
            response.sendRedirect(loginURL);
        }
    }
}</code>

다음 단계를 따르세요. , 페이지 탐색 및 JSF 양식 제출 모두에 대해 인증 리디렉션 기능을 올바르게 구현할 수 있습니다.

위 내용은 사용자 정의 FacesServlet을 사용할 때 JSF 양식 제출 시 인증 리디렉션이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.