ユーザーを別のページにリダイレクトする必要があるかどうかを確認するために、すべてのページが読み込まれる前にいくつかのチェックを行う必要があります (セキュリティ上の理由から)。
JSF 2.0 を使用していたとき、フェーズ リスナーを使用してこの作業を行いました。現在、私は JSF 2.2 を使用しており、すべての Bean が JSF Bean ではなく CDI Bean になっているため、これを行う (またはしない) より良い選択肢が提供されていると思います。
イベントのことは聞いたことがありますがviewAction
、すべてのページでメタデータを繰り返し表示したくありません (他に選択肢がない場合のみ)。
では、CDI を使用して JSF 2.2 でこのシナリオを実装するための最良の方法は何でしょうか?
UPDATE(@skuntselの提案後)
今使っているフィルターです。コードを簡素化するために、認証後にのみ使用したいと思います。ところで、間違いがありましたら教えていただけると幸いです。
@WebFilter("/*")
public class SolicitacoesFilter implements Filter
{
// I can't just use @Inject private User _user, because it needs to be initialized
// only when the user is authenticated. Otherwise an exception is thrown. If this
// filter was called only after the authentication I could use the mentioned code.
private User _user;
@Inject
private Instance<User> _userGetter;
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
if (initializeUser(request))
{
if (_user.isProvisoryPassword())
{
// Redirect to another page...
return;
}
if (_user.getStatus() != Status.ACTIVE)
{
// Redirect to another page...
return;
}
}
chain.doFilter(request, response);
}
@Override
public void destroy()
{
}
private boolean initializeUser(ServletRequest request)
{
boolean userAuthenticated = ((HttpServletRequest) request).getUserPrincipal() != null;
if (userAuthenticated)
{
if (_user == null)
{
_user = _userGetter.get();
}
}
else
{
_user = null;
}
return _user != null;
}
}