0

ユーザーを別のページにリダイレクトする必要があるかどうかを確認するために、すべてのページが読み込まれる前にいくつかのチェックを行う必要があります (セキュリティ上の理由から)。

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;
    }
}
4

1 に答える 1

0

わかりました、リダイレクトが必要な目的は何ですか?

  • 認証目的でセッション ユーザーをチェックする場合は、フィルターを使用します。

http://www.domain.com/login.jsfにログインフォームがあるとしましょうユーザーが接続ボタンを起動したら、ユーザーをhttp://www.domain.com/member/welcome.jsfにリダイレクトし、他の人が member/welcome.jsf ドメインにアクセスしないようにします。http://www.domain.com/member/にあります....

ここではシンプルなデザイン:

@WebFilter("/member/*")  
public class SecurityCheck implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {

}

@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();

    if (session == null || session.getAttribute("User") == null) {
        response.sendRedirect(request.getContextPath() + "/index.xhtml"); // No logged-in user found, so redirect to login page.
    } else {
        chain.doFilter(req, res); // Logged-in user found, so just continue request.
    }

}

@Override
public void destroy() {
// Cleanup global variables if necessary.
}
  • その他の場合、次を使用します。

    <h:link></h:link>,or <h:commandLink></h:commandLink> // Checking in the managed Beans method
    
  • リダイレクト用に xml ファイルを作成することもできます。

于 2013-08-02T10:28:58.890 に答える