私がウェブサイトで言われ、見つけたように、私の Bean は、.xhtml
.
EL式なしでBeanを呼び出すことは可能ですか?
私HomeController
はセッションのステータスをチェックするメソッドを呼び出しておりhome.xhtml
、今のところこの Bean をフォールする必要がないため、これが必要です。
別の方向で解決策を探す必要があります。
コンテナー管理認証を使用する代わりにユーザー認証を自作している場合は、通常、ユーザーがログインしているかどうかを確認するという特定の目的のためにサーブレット フィルターを使用します。
FacesServlet
サーブレット フィルタは、特定の URL パターンにマッピングされるサーブレット ( など) として好きです。その後、その URL パターンに一致するすべてのリクエストで呼び出されます。フィルタ内のリクエスト/セッション データを調べてから、フィルタ チェーンを継続するか、リダイレクトを送信することで、それに応じてリクエスト/レスポンスを処理できます。
javax.servlet.Filter
それに応じてインターフェイスを実装する必要があります。マネージド Bean doFilter()
があると仮定して、メソッドを実装する方法のキックオフ例を次に示します。JSF は、セッション スコープのマネージド Bean を の属性として格納します。@SessionScoped
LoginController
HttpSession
@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);
LoginController loginController = (LoginController) (session != null) ? session.getAttribute("loginController") : null;
if (loginController == null || !loginController.isLoggedIn()) {
response.sendRedirect(request.getContextPath() + "/login.xhtml"); // No logged-in user found, so redirect to login page.
} else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
}
制限されたページをカバーする URL パターンにこのフィルターをマップします/app/*
。
@WebFilter("/app/*")
public class LoginFilter implements Filter {
// ...
}
login.xhtml
もこの URL パターンに含まれており、実際に変更できない場合は更新if
してから、次のようにブロックを変更します。
if (!request.getRequestURI().endsWith("/login.xhtml") && (loginController == null || !loginController.isLoggedIn())) {
// ...
}