JSF プロジェクトで認可をチェックするための PhaseListener を定義します。ただし、HTML5 では機能しません。web.exmlにサーブレットマッピング用のurl=*.htmlを追加してもHTML5では動きません。JSF2 は HTML5 の一部のタグをサポートしていないためです。キャンバスなど
HTML5ファイルがJSFプロジェクトで呼び出されたときに承認を確認するにはどうすればよいですか?
JSF プロジェクトで認可をチェックするための PhaseListener を定義します。ただし、HTML5 では機能しません。web.exmlにサーブレットマッピング用のurl=*.htmlを追加してもHTML5では動きません。JSF2 は HTML5 の一部のタグをサポートしていないためです。キャンバスなど
HTML5ファイルがJSFプロジェクトで呼び出されたときに承認を確認するにはどうすればよいですか?
そもそも、ジョブにフェーズ リスナーを使用するのではなく、サーブレット フィルターを使用する必要があります。フェーズ リスナは、JSF リクエスト、つまり の URL パターンに一致するリクエストのみでのみ実行されますFacesServlet
。フェーズ リスナーは、承認チェックのみを目的とした不器用なアプローチです。
User
ログインしたユーザーをオブジェクトとしてセッションに保存したと仮定して、そのようなフィルターがどのように見えるかの具体的なキックオフの例を次に示します。
@WebFilter("/*")
public class LoginFilter implements Filter {
@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);
User user = (session != null) ? session.getAttribute("user") : null;
String loginURL = request.getContextPath() + "/login.xhtml";
boolean loginRequest = request.getRequestURI().startsWith(loginURL);
boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);
if (user != null || loginRequest || resourceRequest)) {
chain.doFilter(request, response);
} else {
response.sendRedirect(loginURL);
}
}
// ...
}