2012-02-28 8 views
1

私はjsfフェーズリスナーを実装しています。ユーザーがうっとりしているかどうかを確認し、そうでない場合はログインページにリダイレクトします。ユーザーが手動でページにアクセスするのを防ぎます

ここで、ユーザーが手動でアドレスバーに ページ名を入力した場合のフェーズリスナーを実装します。この場合、フェーズリスナーは自動的に ユーザーをログインページにリダイレクトし、セッションを破棄する必要があります。

これはJSFでどのように行われますか?

+0

は、ユーザーが手動で入力したページをクリックしてナビゲートするページ間を区別したいという点についてご質問ですか?あるいはあなたの質問を正しく理解していないのですか? – roel

答えて

0

私はこの方法というJSF 1.2の午前とやった:

public void beforePhase(PhaseEvent event) 
{ 
    FacesContext fCtx = FacesContext.getCurrentInstance(); 
    String actualView = null; 
    actualView = event.getFacesContext().getApplication().getViewHandler().getResourceURL(fCtx, fCtx.getViewRoot().getViewId()); 
    //actualView is the page the user wants to see 
    //you can check, if the user got the permission, is logged in, whatever 
} 

public PhaseId getPhaseId() 
{ 
    return PhaseId.RENDER_RESPONSE; 
} 
+0

これにより、エンド・ユーザーはJSFアクションを認証されるよりもずっと前から呼び出すことができます。私は安全とは言いません。 – BalusC

2

はちょうどここだなど/app/*のような制限されたページの共通URLパターンにマッピングされている単純なサーブレットFilter/pages/*/secured/*を使用あなたが@SessionScoped @ManagedBean UserManagerを持っていると仮定したキックオフの例

@WebFilter(urlPatterns={"/app/*"}) 
public class AuthenticationFilter implements Filter { 

    @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); 
     UserManager userManager = (session != null) ? (UserManager) session.getAttribute("userManager") : null; 

     if (userManager == null || !userManager.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. 
     } 
    } 

    // ... 
} 
+0

私はこれを実現すると言う。ユーザーがログインし、アドレスバーに直接入力するページにアクセスしようとすると、アクセスページをブロックし、ユーザーをログインページにリダイレクトしてセッションを破棄したい場合。それは可能ですか? –

関連する問題